诸如MurmurHash3和 xxHash 之类的非加密哈希几乎是专门为哈希表设计的,但它们的功能似乎与CRC-32、Adler-32和Fletcher-32相当(甚至更好) 。非加密散列通常比 CRC-32 更快,并产生更多“随机”输出,类似于慢速加密散列(MD5、SHA)。尽管如此,我只看到推荐用于数据完整性/校验和目的的 CRC-32 或 MD5。
在下表中,我测试了 32 位校验和/CRC/哈希函数,以确定它们检测数据细微差异的能力:
每个单元格中的结果意味着:A) 发现的冲突数,以及 B) 32 个输出位中的任何一个设置为 1 的最小和最大概率。要通过测试 B,最大值和最小值应尽可能接近 50 . 任何低于 45 或高于 55 的值都表示有偏见。
查看表格,MurmurHash3 和Jenkins lookup2与 CRC-32 相比(实际上未通过一项测试)。它们也分布均匀。DJB2 和 FNV1a 通过了碰撞测试,但分布不均。Fletcher32 和 Adler32 难以应对 NullBytes 和 8RandBytes 测试。
那么我的问题是,与其他校验和相比,“非加密哈希”对于检测文件中的错误或差异有多合适?CRC-32/Adler-32/CRC-64 是否有任何理由可能优于任何体面的 32 位/64 位哈希?