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
两者居然一样, 相同的长度, 相同的字节内容, 仅仅是顺序不同.
就因为它让我调试了几个小时, 最终一路排除到它.