1. 程式人生 > >[譯]C語言實現一個簡易的Hash table(4)

[譯]C語言實現一個簡易的Hash table(4)

att urn 開放 image num pri 實現 需要 code

技術分享圖片

上一章我們解釋了Hash table中最重要的hash函數,並用偽代碼和C語言實現了一個我們自己的hash函數hash函數碰撞是無法避免的,當發生碰撞時我們改如何有效的處理呢?這章我們就來講解下。

處理碰撞

hash函數中將無限大的輸入映射到有限的輸出中,當不同的輸入映射到相同的輸出時,就會發生碰撞,每個的hash表都會采用不同的方法來處理碰撞

我們的哈希表將使用一種稱為開放地址的雙重哈希的技術來處理沖突。雙重哈希使用兩個散列函數來計算在發生碰撞後存儲記錄的索引。

雙重哈希

i發生碰撞後我們使用如下方式來獲取索引:

index = hash_a(string) + i * hash_b(string) % num_buckets

當沒有發生碰撞時,i=0,所以索引就是hash_a的值,發生碰撞後,hash_a的結果就需要經過一次hash_b的處理。

hash_b可能會返回0,將第二項減少到0,這就導致hash表會將多個記錄插入到同一個bucket中,我們可以在hash_b的結果後加1來處理這種情況,確保它永遠不會為0

index = (hash_a(string) + i * (hash_b(string) + 1)) % num_buckets

算法實現

// hash_table.c
static int ht_get_hash(const char* s, const int num_buckets, const int attempt) {
    const int hash_a = ht_hash(s, HT_PRIME_1, num_buckets);
    const int hash_b = ht_hash(s, HT_PRIME_2, num_buckets);
    return (hash_a + (attempt * (hash_b + 1))) % num_buckets;
}

上一章:hash函數
下一章:完成Hash表API


原文地址:https://github.com/jamesroutley/write-a-hash-table/tree/master/05-methods

[譯]C語言實現一個簡易的Hash table(4)