循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据数据包或计算机文件等数据产生简短固定位数校验码的一种散列函數,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。它是由W. Wesley Peterson在他1961年发表的论文中披露[1]。
详见 wiki 循环冗余校验。
最近在做一个项目时需要用到CRC32做URL的Hash,因为JavaScript自身并没有实现CRC32,所以我使用了php.js中的解决方案。
|
|
然而在实际运用中,我发现经常出现与PHP中的crc32()
函数计算出的结果匹配不了的情况。经检查是这个Javascript版的crc32()
在某些情况下会得出负值。比如计算crc32("usercard_show.php");
,用PHP得到的结果是3345955374
,而JavaScript得到的是-949011922
。如果单纯的适用JavaScript生成、检验CRC值当然没问题,但若与PHP联系起来就会出现很大的问题。
看了代码实现,不难猜出问题出在有符号数和无符号数上。JavaScript采用IEEE 754标准定义的64位浮点格式表示数字,因此它的数字都是有符号的。在运算过程中虽然都使用了>>>
(Zero-fill right shift),但是在最后返回结果的时候没有将有符号数转化为无符号数,因此出现了负数的情况。
解决方法很简单,只需要修改最后一行就好了,如下。
|
|