循環冗餘校驗中的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

兩者居然一樣, 相同的長度, 相同的字節內容, 僅僅是順序不同.

就因爲它讓我調試了幾個小時, 最終一路排除到它.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章