為什麼求模運算要用素數(質數) 雜湊表設計

2021-08-02 22:28:43 字數 876 閱讀 8656

為什麼求模運算要用素數(質數)—— 雜湊表設計

by admin| 

2013 年 7 月 25 日

| 雜記, 程式設計技術

在設計用除法來散射的雜湊表時,我們都會用數值模雜湊表大小,得到的餘數來作為id存入雜湊表對應格仔中。所有文章都表明要用乙個較大的素數來作為雜湊表的大小,也就是要模乙個較大的素數。但為什麼就是要用素數呢?簡單分析一下可以看出玄機。

先看看如果用乙個合數8作為雜湊表大小,0-30在雜湊表中的散射情況:

(表1)

再來看看用質數7作為雜湊表大小,0-30在雜湊表中的散射情況:

(表2)

我們都知道,合數8除了1和自身以外,還有2跟4這兩個因數。觀察表1的單獨一列可以發現,這些在同一列的數,他們實際上就是上乙個數+8,而檢視2、4、6這三行我們發現,因為2 4 6 能被2(或4)整除,而在同一列上的數在+8以後一樣滿足可以被2(或4)整除的這一特性。例如4這一列,4、12、20、28,這些雜湊對映在同乙個格仔裡的數都是前乙個數+8,然後他們都能被2和4整除,這樣就導致他們之間有很強烈的關係,很容易發生雜湊衝突。

再來看看表2,同樣情況,同一列中的數都是由上乙個數+7得到的,但因為7是乙個素數,它除了1跟本身之外沒有其他因數,所以在同一列的數里就找不到我們剛剛所說的那種特性。

而我們都知道,雜湊表設計目的就是希望盡量的隨機散射,不希望這些在同一列上的元素(也就是會衝突的元素)之間具有關係,所以我們都採用素數作為雜湊表的大小,從而避免模數相同的數之間具備公共因數。

為什麼求模運算要用素數(質數)

好的hash函式需要把原始資料均勻地分布到hash陣列裡 原始資料不大會是真正的隨機的,可能有某些規律,比如大部分是偶數,這時候如果hash陣列容量是偶數,容易使原始資料hash後不會均勻分布。比如 2 4 6 8 10 12這6個數,如果對 6 取餘 得到 2 4 0 2 4 0 只會得到3種ha...

Hash時取模為什麼要模質數

首先來說假如關鍵字是隨機分布的,那麼無所謂一定要模質數。但在實際中往往關鍵字有某種規律,例如大量的等差數列,那麼公差和模數不互質的時候發生碰撞的概率會變大,而用質數就可以很大程度上迴避這個問題。考慮模是合數的情況 假設n kn,m km,n和m存在最大公因數k,此時可以將n m r轉化為公式n mq...

雜湊取模餘的基底為什麼要選擇素數?

蟬的生命週期為13年或17年,卻很少有14 15或16年,為什麼呢?蟬是弱勢群體,有很多天敵,選擇素數作為其生命週期能最大減少與其天敵們共存的時間,增加自己的存活率,這也是自然選擇的結果。從蟬的哲學中獲得啟示,將雜湊取餘的基底選擇為素數能最大減少雜湊衝突情況的發生,使雜湊分布更均勻。假設hash k...