CRC32可作为哈希函数使用吗?这种方法有什么缺点吗?是否存在任何权衡之处?
Mark Adler提供了一篇由Bret Mulvey撰写的有关哈希计算的有用文章链接。 使用文章中提供的源代码,我对CRC32C和Jenkins96分别进行了“桶测试”。 这些表格显示了真正均匀分布会比机会差 的概率。 因此,数值越高越好。 作者认为0.05或更低是较弱的,0.01或更低则非常弱。 我完全相信作者的所有内容,只是报告结果。
我在所有CRC32C表现优于Jenkins96的实例旁添加了*。 通过这个简单的统计,CRC32C在96次中有54次比Jenkins96更均匀。 特别是如果您可以使用x86 CRC32指令,则速度质量权衡非常好。
CRC32C(0x1EDC6F41)
对于文章作者认为是优秀哈希函数的Jenkins96:
Jenkins96----编辑----
修复过时链接和进行轻微清理。CRC32将字节映射为32位整数,并在累加它们与xor之前。这意味着每个字节只影响哈希中的32位中的8位。当然,CRC32也进行了移位,但这只是把问题藏在地毯下。也就是说,它将不均匀地分布密钥,在某些区域会有严重的聚类现象。它可能看起来能够正常工作,直到你遇到那个区域,突然你的O(1)哈希表变成了O(n)。
CRC32是为检测损坏文件而设计的,而不是哈希。正如Mark所提到的,它也不能保护您的文件免受修改,因为黑客可以通过在更改后插入一个经过精心制作的32位值来随意修改它们。