hash bucket


什么是bucket

bucket的英文解釋: 

Hash table lookup operations are often O(n/m) (where n is the number of objects in the table and m is the number of buckets), which is close to O(1), especially when the hash function has spread the hashed objects evenly through the hash table, and there are more hash buckets than objects to be stored. 

可以這樣理解:

一個HASH的結果所對應的地址可存放兩個BUCKET。可解決HASH沖突。 

  • 要存數據時,第一次HASH到這里,在第一個BUCKET存放一個數據。 
  • 要存數據時,當第二次因某些原因HASH到這里時,在第二個BUCKET存放另一個數據。  

一個由5個buckets組成的哈希表,里面有7個元素:

linux的hash函數hash_long等,用了golden ratio來計算。因為桶(bits)的數量需要由hash函數和對沖突的期望來決定,那么對於hash_long這樣的hash函數,我們怎么確定桶的數量呢? 

一般情況下都是自己根據數據特性來考慮使用的 hash 算法,不是千篇一律咬死一個不放。

比如存放 IP 地址的 hash table,用一個 65536 的桶就很好,把 IP 的后 16bit 作為 key。這種方法絕對比 hash_long、jhash 等函數的碰撞率低。 

其實就是這個界和性能的折中。我可以取我問題空間的最大值。這樣肯定能保證鍵值分散。但是這樣會浪費很多空間。然而取得太小,又影響查找效率。感覺還是要在試驗中進行測試。而且個人覺得,hash比其他搜索的數據結構靈活的地方就是它的可定制性。可以根據具體情況調整,以達到最優的效果。

 

大致的思路是這樣的:


首先哈希桶的個數是固定的,有用戶構建的時候輸入,一旦構建,個數就已經固定;查找的時候首先將key值通過哈希函數獲取哈希值,根據哈希值獲取到對應的哈希桶,然后遍歷哈希桶內的pairs數組獲取;

這兩種實現方法看似比較類似,但也有差異:

基於哈希桶的情況下,由於Hash桶容量的限制,所以,有可能發生Hash表填不滿的情況,也就是,雖然Hash表里面還有空位,但是新建的表項由於沖突過多,而不能裝入Hash表中。不過,這樣的實現也有其好處,就是查表的最大開銷是可以確定的,因為最多處理的沖突數是確定的,所以算法的時間復雜度為O(1)+O(m),其中m為Hash桶容量。

而另一種通過鏈表的實現,由於Hash桶的容量是無限的,因此,只要沒有超出Hash表的最大容量,就能夠容納新建的表項。但是,一旦發生了Hash沖突嚴重的情況,就會造成Hash桶的鏈表過長,大大降低查找效率。在最壞的情況下,時間復雜度退化為O(n),其中n為Hash表的總容量。當然,這種情況的概率小之又小,幾乎是可以忽略的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM