循环冗余校验中的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
两者居然一样, 相同的长度, 相同的字节内容, 仅仅是顺序不同.
就因为它让我调试了几个小时, 最终一路排除到它.
宣称跟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
两者居然一样, 相同的长度, 相同的字节内容, 仅仅是顺序不同.
就因为它让我调试了几个小时, 最终一路排除到它.
相关文章推荐
- 正则表达式,从零开始(不断补充)
- 常用命令
- maven 中将本地jar包映射到maven仓储中
- 欢迎使用CSDN-markdown编辑器
- /etc/passwd
- Android平台车牌识别开发手册
- 字节、字、bit、byte的关系[转]
- 框架: require.js
- 指针做形参
- 从穷人到百万富翁之间的七级台阶 你走了几级?
- 高并发性能调试经验分享
- 魔兽登陆验证算法
- css美化单选款、复选框
- github 搜索技巧
- android四大组件之Service(1) 介绍
- Android Touch事件传递机制
- javascript调试--控制台console
- easyui dialog 关闭按钮怎么去掉
- MOB 微信分享闪退 errCode -6
- 项目管理_FindBugs的使用