Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么在Adler-32校验和算法中使用模65521?_Algorithm_Math_Checksum_Adler32 - Fatal编程技术网

Algorithm 为什么在Adler-32校验和算法中使用模65521?

Algorithm 为什么在Adler-32校验和算法中使用模65521?,algorithm,math,checksum,adler32,Algorithm,Math,Checksum,Adler32,Adler-32校验和算法不进行65521模和运算。我知道65521是适合16位的最大素数,但是为什么在这个算法中使用素数很重要呢 (我相信,一旦有人告诉我,答案似乎是显而易见的,但我大脑中的数论部分就是不工作。即使没有校验和算法方面的专业知识,一个聪明的读书人也可能会向我解释。)长话短说: 素数的模具有最好的位剥离特性,这正是我们想要的哈希值 为什么Adler32使用mod prime? 来自阿德勒自己的网站 然而,阿德勒-32 已构造为将 对数据进行微小更改的方法 这将导致相同的检查值, 通

Adler-32校验和算法不进行65521模和运算。我知道65521是适合16位的最大素数,但是为什么在这个算法中使用素数很重要呢

(我相信,一旦有人告诉我,答案似乎是显而易见的,但我大脑中的数论部分就是不工作。即使没有校验和算法方面的专业知识,一个聪明的读书人也可能会向我解释。)

长话短说:


素数的模具有最好的位剥离特性,这正是我们想要的哈希值

为什么Adler32使用mod prime?

来自阿德勒自己的网站

然而,阿德勒-32 已构造为将 对数据进行微小更改的方法 这将导致相同的检查值, 通过使用总和 大于字节并使用 模量的素数(65521)<是的 在这方面,需要进行一些分析 这是理所当然的,但还没有实现 完成。

Adler-32的主要原因是 当然,软件的速度 实现

Adler-32的替代品是Fletcher-32,它将65521的模替换为65535。本文表明,Fletcher-32在具有低速率随机比特错误的信道中具有优越性

之所以使用它,是因为素数往往具有更好的混合特性。它到底有多好还有待讨论

其他解释

这个线程中的其他人提出了一个有点令人信服的论点,即模素数更适合检测位交换。但是,这很可能是而不是,因为位交换非常罕见。两个最常见的错误是:

  • 任意位置常见的随机位翻转(10)
  • 网络中常见的位移位(12345->23445或123445)
  • 大部分的位交换都是由随机的位翻转引起的,这些位翻转看起来就像是位交换

    事实上,纠错码的设计可以承受n位的偏差。从阿德勒的网站:

    正确构造的CRC-n具有 这是一个很好的属性,在 错误总是可以检测到的。这是 对于Adler-32来说并不总是如此——它可以 检测所有单字节或双字节错误,但 可能会丢失一些三字节错误

    使用素数模的有效性

    我就同一个问题写了一篇长篇大论。为什么要模素数

    简短的回答

    我们对素数的了解比复合数少得多。所以像Knuth这样的人开始使用它们

    虽然素数与我们散列的大部分数据的关系可能较小,但增加表/模大小也会降低冲突的概率(有时比舍入到最接近的素数所获得的任何好处都要大)


    这里是一个1000万个加密随机整数的每个桶的冲突数,比较mod 65521和65535。

    Adler-32算法要计算

    A = 1 + b1 + b2 + b3 + ...
    

    并以m的模报告它们。当m是素数时,模m的数形成了数学家所称的场。字段有一个便利的属性,即对于任何非零c,我们有a=b当且仅当c*a=c*b。将不是素数的时间表模6与时间表模5进行比较,后者是:

    * 0 1 2 3 4 5
    0 0 0 0 0 0 0
    1 0 1 2 3 4 5
    2 0 2 4 0 2 4
    3 0 3 0 3 0 3
    4 0 4 2 0 4 2
    5 0 5 4 3 2 1
    
    * 0 1 2 3 4
    0 0 0 0 0 0
    1 0 1 2 3 4
    2 0 2 4 1 3
    3 0 3 1 4 2
    4 0 4 3 2 1
    
    现在,每当我们交换两个字节时,A部分就被愚弄了——毕竟加法是可交换的。B部分应该检测这种错误,但当m不是素数时,更多的位置容易受到攻击。考虑

    的艾德勒校验和MOD 6
    1 3 2 0 0 4
    
    我们有A=4和B=1。现在考虑交换B2和B4:

    1 0 2 3 0 4
    
    A和B不变,因为2*3=4*0=2*0=4*3(模6)。也可以交换2和5以获得相同的效果。当时间表不平衡时更可能出现这种情况——模5,检测到这些变化。事实上,素数模检测不到单个交换的唯一时间是交换两个相等的索引mod m时(如果m很大,它们必须相距很远!)。^此逻辑也可以应用于交换的子字符串

    使用较小模数的缺点是,它在随机数据上的失效频率稍高;然而,在现实世界中,腐败很少是随机的

    ^证明:假设我们将索引i和j与值a和b交换。然后ai+bj=aj+bi,因此ai-aj+bj-bi=0和(a-b)*(i-j)=0。由于字段是整型域,因此a=b(值是全等的)或i=j(索引是全等的)


    编辑:Unknown链接到()的网站明确表示,Adler-32的设计根本没有原则性。由于DEFLATE流中的哈夫曼代码,即使是很小的错误也可能改变帧(因为它依赖于数据),并在输出中导致较大的错误。考虑这个答案,一个稍微有人为的例子,为什么人们把某些属性归因于素数。

    < P>对于完全随机数据,越多桶越好。

    假设数据在某种程度上是非随机的。现在,非随机性可能影响算法的唯一方式是创建一种情况,即某些桶的使用概率高于其他桶

    如果模数是非素数,那么任何影响构成模的数字之一的模式都可能影响哈希。因此,如果使用15,则每3或5个模式以及每15个模式都可能导致碰撞,而如果使用13,则必须每13个模式才能导致碰撞

    65535=3*5*17*257,所以一个包含3或5的模式可能会使用这个模引起冲突——例如,如果由于某种原因,3的倍数更为常见,那么只有3的倍数的桶才能被很好地使用

    现在,我不确定,实际上,这是否可能成为一个问题。最好根据经验确定碰撞率,而不是使用想要散列的类型的实际数据
    1 0 2 3 0 4
    
    m * x = (in Z/Z_n) 
    
    2 * x = 0 (mod 10)