为什么adler32(0xFFFFFFFF,“”)= 0xE000E?

时间:2012-03-09 04:11:39

标签: hash zlib

我注意到zlib的adler32 function在传递空字符串时并不总是返回原始种子。例如:

adler32(0xFFFFFFFF,          // seed
        (const Bytef *) "",  // buffer
        0                    // length
       )

返回0xE000E。我认为它应该返回0xFFFFFFFF

对于大多数其他值,它确实返回原始种子。但是,对于从0到0xFFFFFFFF的1965855数字,adler32会在输入字符串为空时更改种子。

这是实现的错误或奇怪行为,还是Adler-32函数的范围实际上是[0,0xFFFFFFFF]的子集?

请注意,当指针为NULL时,adler32始终返回1(初始种子)。这是documented行为。

1 个答案:

答案 0 :(得分:2)

第一个论点不是“种子”。它是先前附加到的adler32值。

是的,adler32的范围不是所有32位值。 0xffffffff不是有效的adler32。唯一有效的adler32值是那些32位值的上半部分和下半部分在被解释为整数时都小于65521的值。当你调用长度为零的adler32()时,它将返回上半部和下半部模数为65521。

1965855是65521 * 15 + 15 * 65521 + 15 * 15,这是32位值的数字,有效的上半部分和无效的下半部分,加上上半部分无效和下半部分有效的数字,加上两半的数字无效。