哈希函數一般都要取模,取模一般都要取質數,那么為什么一定要取質數呢?
做如下分析:
概念與公式
設我們通過哈希函數得到的未取模的值為X,一質數模數為a,非質數模數為b,X對a取模后的結果為Ya,對b取模后的結果為Yb
則有
\[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 \]以上公式與概念均已被證明,是推論的基石
假設所有X隨機出現,則有
- 模質數時:
\[ Y_a \in [0,a-1],均勻分布 \]
- 模合數時:
\[ Y_b \in [0,b-1],均勻分布 \]
假設X成公差為m的等差數列出現,且m與b存在公因數c,則有
- 模質數時:
\[記首項為X_1,第i項為X_i,第i項取模后得到Y_i,則\\ \\ \begin{equation} \begin{aligned} Y_i&=(X_1+(i-1)m)\;\textbf{mod}\;a\\ &=(X_1\; \textbf{mod} \; a+((i-1)m)\;\textbf{mod}\;a)\;\textbf{mod}\;a\\ &=(Y_1+k_i)\;\textbf{mod}\;a\qquad\qquad,k_i\in[0,a) \end{aligned} \end{equation} \]
可見仍有
\[ Y_i\in[0,a-1] \]
- 模合數時:
\[\begin{equation} \begin{aligned} Y_i&=(X_1+(i-1)m)\;\textbf{mod}\;b\\ &=(X_i\; \textbf{mod} \; b+((i-1)m)\;\textbf{mod}\;b)\;\textbf{mod}\;b\\\ &=(Y_1+(i-1)(\frac{m}{c})\;\textbf{mod}\;(\frac{b}{c}))\; \textbf{mod} \;b\\ &=(Y_1+k_i)\;\textbf{mod} \;b\qquad\qquad,k_i\in[0,\frac{b}{c}) \end{aligned} \end{equation} \]
可見Yi取值范圍縮小到了原來的1/c,即成等差數列的X每b/c個數據就會出現一次沖突
以上就是公式推導,下面可以用實驗證明一下
數據實驗
以一組以108為首項,27為公差的等差數列觀察,有如下結果:
可以看到,模合數的情況下每3項就會發生一次碰撞,而模質數的情況下沒有發生碰撞,這樣的例子還有很多,讀者可以自行舉例實驗
總結
之所以要模質數,是因為對於特殊數據,模合數的話會發生大量碰撞,而模質數可以避免這種情況
以上。