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

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

两者居然一样, 相同的长度, 相同的字节内容, 仅仅是顺序不同.

就因为它让我调试了几个小时, 最终一路排除到它.



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值