当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Hash用法及代码示例


本文简要介绍rust语言中 Trait std::hash::Hash 的用法。

用法

pub trait Hash {
    fn hash<H>(&self, state: &mut H)    where        H: Hasher;

    fn hash_slice<H>(data: &[Self], state: &mut H)    where        H: Hasher,
    { ... }
}

一种可散列的类型。

实现 Hash 的类型可以通过 Hasher 的实例进行 hash 编辑。

实施Hash

如果所有字段都实现 Hash ,则可以使用 #[derive(Hash)] 派生 Hash 。生成的哈希将是在每个字段上调用 hash 的值的组合。

#[derive(Hash)]
struct Rustacean {
    name: String,
    country: String,
}

如果您需要更多地控制值的散列方式,您当然可以自己实现 Hash 特征:

use std::hash::{Hash, Hasher};

struct Person {
    id: u32,
    name: String,
    phone: u64,
}

impl Hash for Person {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.id.hash(state);
        self.phone.hash(state);
    }
}

HashEq

在同时实现 Hash Eq 时,保持以下属性很重要:

k1 == k2 -> hash(k1) == hash(k2)

换句话说,如果两个键相等,那么它们的哈希值也必须相等。 HashMap HashSet 都依赖于这种行为。

值得庆幸的是,在使用 #[derive(PartialEq, Eq, Hash)] 派生 Eq Hash 时,您无需担心维护此属性。

前缀冲突

hash 的实现应确保它们传递给Hasher 的数据是prefix-free。也就是说,不相等的值应该导致写入两个不同的值序列,并且两个序列都不应该是另一个序列的前缀。

例如,标准实施Hash 对应 &str通过额外的0xFF字节到Hasher使值("ab", "c")("a", "bc")散列不同。

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::hash::Hash。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。