Hash 为什么adler32(0xFFFFFFFF,";)=0xE000E?

Hash 为什么adler32(0xFFFFFFFF,";)=0xE000E?,hash,zlib,Hash,Zlib,我注意到,当传递一个空字符串时,zlib并不总是返回原始种子。例如: adler32(0xFFFFFFFF, // seed (const Bytef *) "", // buffer 0 // length ) 返回0xE000E。我认为它应该返回0xFFFFFFFF 对于大多数其他值,它确实返回原始种子。但是,对于从0到0xFFFFFF的1965855个数字,adler32在输入字符串为

我注意到,当传递一个空字符串时,zlib并不总是返回原始种子。例如:

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位值的数目,加上具有无效上半部分和有效下半部分的数字,再加上具有两个半部分的数字无效