爲什麼求模運算要用素數(質數)—— 哈希表設計

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

先看看如果用一個合數8作爲哈希表大小,0-30在哈希表中的散射情況:

(表1)

mod8

再來看看用質數7作爲哈希表大小,0-30在哈希表中的散射情況:

(表2)

mod7

我們都知道,合數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跟本身之外沒有其他因數,所以在同一列的數裏就找不到我們剛剛所說的那種特性。

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

發佈了46 篇原創文章 · 獲贊 23 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章