本文简要介绍rust语言中 Trait core::hash::Hash
的用法。
用法
pub trait Hash {
fn hash<H: Hasher>(&self, state: &mut H);
fn hash_slice<H: Hasher>(data: &[Self], state: &mut H) where Self: Sized,
{ ... }
}
一种可散列的类型。
实现 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);
}
}
Hash
和 Eq
在同时实现 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 HashSet.get_or_insert_with用法及代码示例
- Rust HashMap.get用法及代码示例
- Rust HashMap.try_insert用法及代码示例
- Rust HashSet.insert用法及代码示例
- Rust HashSet.get_or_insert用法及代码示例
- Rust HashSet用法及代码示例
- Rust HashSet.is_superset用法及代码示例
- Rust HashSet.shrink_to用法及代码示例
- Rust HashMap.keys用法及代码示例
- Rust HashSet.with_hasher用法及代码示例
- Rust HashMap.iter用法及代码示例
- Rust HashMap.iter_mut用法及代码示例
- Rust HashMap.retain用法及代码示例
- Rust HashMap.with_capacity_and_hasher用法及代码示例
- Rust HashSet.with_capacity用法及代码示例
- Rust HashSet.difference用法及代码示例
- Rust HashMap.clear用法及代码示例
- Rust HashMap.reserve用法及代码示例
- Rust HashSet.try_reserve用法及代码示例
- Rust HashMap.with_hasher用法及代码示例
- Rust HashMap.into_keys用法及代码示例
- Rust HashSet.hasher用法及代码示例
- Rust HashMap.into_values用法及代码示例
- Rust HashMap.get_mut用法及代码示例
- Rust HashSet.drain_filter用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait core::hash::Hash。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。