Adler32已經在很多地方替代了CRC32, 比如Zip
宣稱跟CRC32一樣可靠而且速度快很多
速度快是可以說得過去,不過使用餘式表的CRC32速度也慢不到哪裏去,而重要的是可靠性
先看下Adler32的算法(選自V32.dll,遊俠基礎類庫)
V32NAKED VIU V32CALL V32Adler(PCRC32 lpEnv, PVI0 lpVoid, VIU dwSize)
{
//a = 1, b = 0;
//for(index = 0; index < len; ++index)
//{
// a = (a + data[index]) % MOD_ADLER;
// b = (b + a) % MOD_ADLER;
//}
//return (b << 16) | a;
_asm{
push edi
push esi
push ebx
...
pop ebx
pop esi
pop edi
ret 0ch
}
}
(基礎類庫有關彙編源碼目前仍然保密,因此略掉, 實現的與C/C++註釋功能相同)
那麼問題來了:
V32Adler("0x0201") == 0x0565016C
V32Adler("0x0120") == 0x0565016C
兩者居然一樣, 相同的長度, 相同的字節內容, 僅僅是順序不同.
就因爲它讓我調試了幾個小時, 最終一路排除到它.