您的位置:首页 > 其它

循环冗余校验中的Adler32算法并没有所说的那么可靠

2016-06-24 13:44 204 查看
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

两者居然一样, 相同的长度, 相同的字节内容, 仅仅是顺序不同.
就因为它让我调试了几个小时, 最终一路排除到它.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: