Hash 为什么adler32(0xFFFFFFFF,";)=0xE000E?
我注意到,当传递一个空字符串时,zlib并不总是返回原始种子。例如:Hash 为什么adler32(0xFFFFFFFF,";)=0xE000E?,hash,zlib,Hash,Zlib,我注意到,当传递一个空字符串时,zlib并不总是返回原始种子。例如: adler32(0xFFFFFFFF, // seed (const Bytef *) "", // buffer 0 // length ) 返回0xE000E。我认为它应该返回0xFFFFFFFF 对于大多数其他值,它确实返回原始种子。但是,对于从0到0xFFFFFF的1965855个数字,adler32在输入字符串为
adler32(0xFFFFFFFF, // seed
(const Bytef *) "", // buffer
0 // length
)
返回0xE000E
。我认为它应该返回0xFFFFFFFF
对于大多数其他值,它确实返回原始种子。但是,对于从0到0xFFFFFF的1965855个数字,adler32
在输入字符串为空时更改种子
这是一个bug还是实现的奇怪行为,或者Adler-32函数的范围实际上是[0,0xFFFFFF]的子集
请注意,当指针为
NULL
时,adler32
始终返回1
(初始种子)。这是行为。第一个参数不是“种子”。要附加到的是上一个adler32值
是的,adler32的范围不是所有32位值。0xFFFFFF不是有效的adler32。唯一有效的adler32值是当解释为整数时,32位值的上半部和下半部16位都小于65521的值。当以零长度调用adler32()时,它将返回上半部分和下半部分的模65521
1965855是65521*15+15*65521+15*15,它是具有有效上半部分和无效下半部分的32位值的数目,加上具有无效上半部分和有效下半部分的数字,再加上具有两个半部分的数字无效