• 为什么哈希函数要模质数


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

    做如下分析:

    概念与公式

    设我们通过哈希函数得到的未取模的值为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,则\\ \\ \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,即成等差数列的Xb/c个数据就会出现一次冲突

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

    数据实验

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

    可以看到,模合数的情况下每3项就会发生一次碰撞,而模质数的情况下没有发生碰撞,这样的例子还有很多,读者可以自行举例实验

    总结

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

    以上。

  • 相关阅读:
    又是一个值班日
    今天早上起来头有点疼
    虽说今天加班
    昨天加班又是到8:00
    昨天晚上加班到9:15
    昨天晚上还是在弄国境点的事情
    今天是下了雨
    Keras/tensorflow出现‘Loaded runtime CuDNN library: 7.0.5 but source was compiled with: 7.1.14’错误的解决办法
    深度学习基础系列(十一)| Keras中图像增强技术详解
    Docker应用系列(六)| 如何去掉sudo及避免权限问题
  • 原文地址:https://www.cnblogs.com/cryingrain/p/11144225.html
Copyright © 2020-2023  润新知