最近我學哈希表,並理解的基礎,是如果散列值是唯一的,但哈希表中的散列%大小相同,會發生什麼情況?
創建一個數組,例如
hashtable ht[4];
哈希關鍵
int hash = hash_key(key);
獲得索引
int index = hash % 4
設置爲hashtable中
ht[index] = insert_or_update(value)
而且我知道有散列衝突問題,如果key1
和key2
具有相同的哈希,他們去同ht[index]
,所以separate chaining
能解決這個問題。
鍵採用相同的哈希去同一個桶中,這些密鑰將被存儲在一個鏈表。
我的問題是,如果散列不同,會發生什麼,但模數是相同的?
例如,
hash(key1): 3
hash(key2): 7
hash(key3): 11
hash(key4): 15
所以指數是3,這些鍵具有不同的散列和不同的密鑰轉到同一個桶
我搜索谷歌一些哈希表的實現,似乎他們不處理這種情況。我是否推翻了?哪裏不對了?
例如,這些實現:
https://gist.github.com/tonious/1377667#file-hash-c-L139
的Redis: https://github.com/antirez/redis/blob/unstable/src/dict.c#L488
nginx的: https://github.com/nginx/nginx/blob/master/src/core/ngx_hash.c#L34
他們只是比較,如果鍵等於
模數決定了桶的大小,而且大部分時間散列都是不同的。在任何情況下,映射到同一個存儲桶的兩個條目都是衝突。 –
OT提示:通過在'hash%4'中使用素數而不是4進行修改會使索引更好,從而減少碰撞可能性。 – chux