2012-03-09 54 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位值的數量,加上無效的數字上半部分和有效下半部分,加上兩半的數字無效。