哈希函數通常都要取模,取模通常都要取質數,那麼爲何必定要取質數呢?函數
作以下分析:ui
設咱們經過哈希函數獲得的未取模的值爲X,一質數模數爲a,非質數模數爲b,X對a取模後的結果爲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
模質數時:
\[ Y_a \in [0,a-1],均勻分佈 \]qq
模合數時:
\[ Y_b \in [0,b-1],均勻分佈 \]總結
模質數時:
\[ 記首項爲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項就會發生一次碰撞,而模質數的狀況下沒有發生碰撞,這樣的例子還有不少,讀者能夠自行枚舉實驗,相信這個例子已經能夠說明問題了
之因此要模質數是由於對於特殊數據合數會發生大量碰撞,而質數能夠避免這種狀況 以上。