2012-03-09 34 views
0

我注意到zlib的adler32 function并不总是在传递空字符串时返回原始种子。例如:为什么是adler32(0xFFFFFFFF,“”)= 0xE000E?

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

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

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

这是一个错误或古怪的执行行为,或者是Adler-32函数的范围实际上是[0,0xFFFFFFFF]的一个子集?

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

回答

1

第一个参数是不是一个“种子”。这是之前附加的adler32值。

是,的Adler32的范围是不是所有的32位值。 0xffffffff不是有效的adler32。唯一有效的Adler32值是那些其中的32位值的上和下16位半部,当解释为整数,二者小于65521.当调用具有零长度的Adler32(),它会返回上半部分和下半部分以65521为模。

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