好的hash函式需要把原始資料均勻地分布到hash陣列裡
原始資料不大會是真正的隨機的,可能有某些規律,
比如大部分是偶數,這時候如果hash陣列容量是偶數,容易使原始資料hash後不會均勻分布。
比如 2 4 6 8 10 12這6個數,如果對 6 取餘 得到 2 4 0 2 4 0 只會得到3種hash值,衝突會很多
如果對 7 取餘 得到 2 4 6 1 3 5 得到6種hash值,沒有衝突
同樣地,如果資料都是3的倍數,而hash陣列容量是3的倍數,hash後也容易有衝突
用乙個質數則會減少衝突的概率
為什麼求模運算要用素數(質數) 雜湊表設計
為什麼求模運算要用素數 質數 雜湊表設計 by admin 2013 年 7 月 25 日 雜記,程式設計技術 在設計用除法來散射的雜湊表時,我們都會用數值模雜湊表大小,得到的餘數來作為id存入雜湊表對應格仔中。所有文章都表明要用乙個較大的素數來作為雜湊表的大小,也就是要模乙個較大的素數。但為什麼就...
Hash時取模為什麼要模質數
首先來說假如關鍵字是隨機分布的,那麼無所謂一定要模質數。但在實際中往往關鍵字有某種規律,例如大量的等差數列,那麼公差和模數不互質的時候發生碰撞的概率會變大,而用質數就可以很大程度上迴避這個問題。考慮模是合數的情況 假設n kn,m km,n和m存在最大公因數k,此時可以將n m r轉化為公式n mq...
雜湊取模餘的基底為什麼要選擇素數?
蟬的生命週期為13年或17年,卻很少有14 15或16年,為什麼呢?蟬是弱勢群體,有很多天敵,選擇素數作為其生命週期能最大減少與其天敵們共存的時間,增加自己的存活率,這也是自然選擇的結果。從蟬的哲學中獲得啟示,將雜湊取餘的基底選擇為素數能最大減少雜湊衝突情況的發生,使雜湊分布更均勻。假設hash k...