为何哈希函数要模质数

哈希函数通常都要取模,取模通常都要取质数,那么为何必定要取质数呢?函数

作以下分析: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项就会发生一次碰撞,而模质数的状况下没有发生碰撞,这样的例子还有不少,读者能够自行枚举实验,相信这个例子已经能够说明问题了

总结

之因此要模质数是由于对于特殊数据合数会发生大量碰撞,而质数能够避免这种状况 以上。

相关文章
相关标签/搜索