为什么哈希函数要模质数

哈希函数一般都要取模,取模一般都要取质数,那么为什么一定要取质数呢?

做如下分析:

概念与公式

设我们通过哈希函数得到的未取模的值为X,一质数模数为a,非质数模数为bXa取模后的结果为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,则\\ 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个数据就会出现一次冲突

以上就是公式推导,下面可以用实验证明一下

数据实验

以一组以108为首项,27为公差的等差数列观察,有如下结果:

1247586-20190706212947067-760062662.png

1247586-20190706212957186-1658003143.png

可以看到,模合数的情况下每隔2项就会发生一次碰撞,而模质数的情况下没有发生碰撞,这样的例子还有很多,读者可以自行枚举实验,相信这个例子已经可以说明问题了

总结

之所以要模质数是因为对于特殊数据合数会发生大量碰撞,而质数可以避免这种情况
以上。

转载于:https://www.cnblogs.com/cryingrain/p/11144225.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值