哈希取模餘的基底爲何要選擇素數?

蟬的哲學

蟬的生命週期爲13年或17年,卻不多有1四、15或16年,爲何呢?蟬是弱勢羣體,有不少天敵,選擇素數做爲其生命週期能最大減小與其天敵們共存的時間,增長本身的存活率,這也是天然選擇的結果。spa

原理分析

從蟬的哲學中得到啓示,將哈希取餘的基底選擇爲素數能最大減小哈希衝突狀況的發生,使哈希分佈更均勻。生命週期

假設hash(key) = key % M,
若 M = 2^k, 則 key % M = key & (M - 1), 而
M - 1 = 00000..(n-k個0)..000000 1111....(k個1)....11111
key跟M - 1相與以後,永遠只截取了最後k位,前n - k位對哈希地址無影響,顯然這樣會增長哈希衝突的機率。ip

M取其餘非素數仍然會有相似的缺陷,只有當M爲素數時,數據對散列表的覆蓋最充分、分佈最均勻。hash

爲何M取素數時覆蓋最均勻?

咱們處理的數據通常都具備局部性,一般想for或while循環同樣以必定的步長遍歷數據,遍歷方式以下所示:it

clipboard.png

由數論的知識能夠知道當且僅當步長S與M的最大公因數爲1時,遍歷的足跡才能覆蓋整個散列表。
不一樣的程序代碼有不一樣的步長遍歷方式,他們可能都要使用同一個散列表,當M爲素數時才能保證M與全部的步長S的最大公因數都爲1。即M取素數時才能使遍歷的足跡分佈均勻,減小衝突發生的機率。class

相關文章
相關標籤/搜索