當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。