Kri*_*son 15 algorithm math checksum adler32
Adler-32校验和算法总和模数为65521.我知道65521是最大的素数,适合16位,但为什么在这个算法中使用素数很重要?
(我确信一旦有人告诉我,答案就会显而易见,但我脑中的数论理论部分却无法正常工作.即使没有校验和算法方面的专业知识,一个聪明的人也会阅读http://en.wikipedia. org/wiki/Fletcher%27s_checksum可能会向我解释.)
Unk*_*own 19
为什么mod prime用于Adler32?
来自Adler自己的网站http://zlib.net/zlib_tech.html
然而,Adler-32的构造是通过使用明显大于字节的和并使用模数的素数(65521)来最小化导致相同校验值的数据中的小变化的方法.在这方面,某些分析是值得的,但尚未完成.
当然,Adler-32的主要原因是软件实现的速度.
替代Adler-32的是Fletcher-32,它将65521的模数替换为65535.本文表明Fletcher-32对于具有低速率随机误码的信道是优越的.
使用它是因为素数倾向于具有更好的混合性质.究竟有多好还有待讨论.
其他解释
这个帖子中的其他人做出了一个有点令人信服的论证,即模数质量更适合检测比特交换.然而,这很可能不是这种情况,因为比特交换非常罕见.两个最常见的错误是:
大多数位交换都是由随机位翻转引起的,这看起来像是有点交换.
事实上,纠错码设计用于承受n位偏差.来自Adler的网站:
正确构造的CRC-n具有良好的特性,即总是可以检测到小于n位的错误.对于Adler-32而言,情况并非总是如此 - 它可以检测所有单字节或双字节错误,但可能会错过一些三字节错误.
使用质数模量的有效性
我在基本相同的问题上做了很长的写作.为什么模数素数?
http://www.codexon.com/posts/hash-functions-the-modulo-prime-myth
简短的回答
我们对素数的了解远远少于复合数.因此像Knuth这样的人开始使用它们.
虽然素数与我们散列的大部分数据之间的关系可能较少,但增加表/模数也会降低碰撞的概率(有时甚至超过向下舍入到最接近的素数所获得的任何好处).
下面是每桶冲突的图表,其中有1000万个加密随机整数,比较mod 65521和65535.