爲何哈希函數要模質數

哈希函數通常都要取模,取模通常都要取質數,那麼爲何必定要取質數呢?函數

作以下分析:ui

概念與公式

設咱們經過哈希函數獲得的未取模的值爲X,一質數模數爲a,非質數模數爲bXa取模後的結果爲Ya,對b取模後的結果爲Ybspa

則有blog

\[ Y_a\equiv X \pmod a \\ Y_b\equiv X\pmod b \\ c(x \; mod \; y)=(cx)\; mod \; (cy)\\ (a+b)\; mod \; p=(a\; mod\; p+b\; mod\; p)\;mod \;p \]class

以上公式與概念均已被證實,是推論的基石im

假設全部X隨機出現,則有

  • 模質數時:
    \[ Y_a \in [0,a-1],均勻分佈 \]qq

  • 模合數時:
    \[ Y_b \in [0,b-1],均勻分佈 \]總結

假設X成公差爲m的等差數列出現,且m與b存在公因數c,則有

  • 模質數時:
    \[ 記首項爲X_1,第i項爲X_i,第i項取模後獲得Y_i,則\\ Y_i=(X_1+(i-1)m)\;mod\;a\\ \qquad\qquad\qquad\quad =(X_1\; mod \; a+((i-1)m)\;mod\;a)\;mod\;a\\ \qquad\quad =(Y_1+k_i)\;mod\;a\quad,k_i\in[0,a-1] \]
    可見仍有
    \[ Y_i\in[0,a-1] \]數據

  • 模合數時:
    \[ Y_i=(X_1+(i-1)m)\;mod\;b\\ \qquad\qquad\qquad\quad =(X_i\; mod \; b+((i-1)m)\;mod\;b)\;mod\;b\\\ \qquad\qquad\qquad\quad=(Y_1+(i-1)(m/c)\;mod\;(b/c))\; mod \;b\\ \qquad\qquad\qquad=(Y_1+k_i)\;mod \;b\quad,k_i\in[0,b/c-1] \]
    可見Yi取值範圍縮小到了原來的1/c,即成等差數列的X每隔b/c-1個數據就會出現一次衝突img

以上就是公式推導,下面能夠用實驗證實一下

數據實驗

以一組以108爲首項,27爲公差的等差數列觀察,有以下結果:

能夠看到,模合數的狀況下每隔2項就會發生一次碰撞,而模質數的狀況下沒有發生碰撞,這樣的例子還有不少,讀者能夠自行枚舉實驗,相信這個例子已經能夠說明問題了

總結

之因此要模質數是由於對於特殊數據合數會發生大量碰撞,而質數能夠避免這種狀況 以上。

相關文章
相關標籤/搜索