本文簡要介紹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);
}
}
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 std::hash::Hash。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。