我注意到当传递空字符串时,zlib的adler32 function并不总是返回原始种子。例如:
adler32(0xFFFFFFFF, // seed
(const Bytef *) "", // buffer
0 // length
)返回0xE000E。我认为它应该返回0xFFFFFFFF。
对于大多数其他值,它确实会返回原始种子。但是,对于1965855个从0到0xFFFFFFFF的数字,当输入字符串为空时,adler32会更改种子。
这是一个bug还是实现的奇怪行为,或者Adler-32函数的范围实际上是0,0xFFFFFFFF的子集?
请注意,当指针为NULL时,adler32始终返回1 (初始种子)。这是documented行为。
发布于 2012-03-09 12:41:59
第一个参数不是“种子”。它是要追加的前一个adler32值。
可以,adler32的范围不全是32位的值。0xffffffff不是有效的adler32。唯一有效的adler32值是32位值的上半部分和下半部分在解释为整数时都小于65521。当您以零长度调用adler32()时,它将返回以65521为模的上半部分和下半部分。
1965855等于65521*15 + 15*65521 + 15*15,即上半部分有效、下半部分无效的32位数值的个数加上上半部分无效、下半部分无效的32位数值的个数。
https://stackoverflow.com/questions/9628825
复制相似问题