哈希函数通常都要取模,取模通常都要取质数,那么为何必定要取质数呢?函数
作以下分析: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项就会发生一次碰撞,而模质数的状况下没有发生碰撞,这样的例子还有不少,读者能够自行枚举实验,相信这个例子已经能够说明问题了
之因此要模质数是由于对于特殊数据合数会发生大量碰撞,而质数能够避免这种状况 以上。