我注意到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行为。
答案 0 :(得分:2)
第一个论点不是“种子”。它是先前附加到的adler32值。
是的,adler32的范围不是所有32位值。 0xffffffff不是有效的adler32。唯一有效的adler32值是那些32位值的上半部分和下半部分在被解释为整数时都小于65521的值。当你调用长度为零的adler32()时,它将返回上半部和下半部模数为65521。
1965855是65521 * 15 + 15 * 65521 + 15 * 15,这是32位值的数字,有效的上半部分和无效的下半部分,加上上半部分无效和下半部分有效的数字,加上两半的数字无效。