You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:06:19