如何在Rust中实现可用于HashMap/HashSet的自定义哈希函数
问题:为Rust的Position类型实现基于Szudzik配对函数的自定义哈希
我想为Rust中的HashMap和HashSet实现自定义哈希函数,采用Szudzik配对函数。但查阅文档发现Hasher trait的描述是一个用于对任意字节流进行哈希的trait,我希望直接用计算得到的哈希值作为最终哈希结果,有没有不需要处理任意字节流的实现方式?
初始实现代码
use std::hash::{Hash, Hasher}; #[derive(Copy, Clone)] pub struct Position { pub x: i32, pub y: i32, } impl Position { // 构造函数,传入x和y pub fn new(x: i32, y: i32) -> Self { Self { x, y } } } impl PartialEq for Position { fn eq(&self, other: &Self) -> bool { self.x == other.x && self.y == other.y } } impl Eq for Position {} impl Hash for Position { fn hash<H: Hasher>(&self, _state: &mut H) { let x: u64 = self.x.abs() as u64; let y: u64 = self.y.abs() as u64; let mut _hash_val: u64 = 0; /* Szudzik配对函数 */ if x >= y { _hash_val = x * x + x + y; } else { _hash_val = x + y * y; } } }
修正后的实现
我之前只看了文档第一行,误以为只能操作8位字节,实际上Hasher提供了write_u64()方法,可以直接将计算好的哈希值写入哈希状态中。修改后的Hash实现如下:
impl Hash for Position { fn hash<H: Hasher>(&self, state: &mut H) { assert!(self.x >= 0); assert!(self.y >= 0); let x: u64 = self.x as u64; let y: u64 = self.y as u64; /* Szudzik配对函数 */ let hash_val: u64 = if x >= y { x * x + x + y } else { x + y * y }; state.write_u64(hash_val); } }
内容的提问来源于stack exchange,提问作者Rampagy
相关产品推荐
相关产品推荐

