David
更新,2014年8月
在最近的一条评论中,由于Arnaud Bouchez和其他回答和评论的影响,我承认原始答案需要修改或至少有资格。我保留了原始答案作为参考。
首先,也许最重要的是,对问题的公正回答取决于哈希代码的预期用途:使用“好”[哈希函数]的意义是什么?哈希将在何处/如何使用?(例如,它是用于散列相对较短的输入密钥吗?用于索引/查找目的,生成消息摘要或其他用途?所需哈希代码本身有多长,全部32位[CRC32或其派生物],更多位,更少...等等?
OP的问题要求“更快的通用哈希函数”,因此重点是速度(一些不太CPU密集的东西和/或可以利用各种性质的并行处理)。我们可能会注意到,在哈希应用程序中,哈希代码本身的计算时间通常只是问题的一部分(例如,如果哈希代码的大小或其固有特性导致许多冲突,这需要额外的周期来处理)。此外,“通用”要求留下了许多关于可能用途的问题。
考虑到这一点,一个简短而更好的答案可能是:
是的,较新的英特尔处理器上的CRC32C硬件实现可以用于构建更快的哈希代码;但是请注意,由于碰撞频率和需要使用更长的代码,根据哈希的具体实现和应用程序,总体结果可能不太理想。此外,对于哈希的加密用途,应该仔细审查,因为CRC32算法本身在这方面非常薄弱。原始答案和编辑(2010年4月):
先验地,这听起来像一个糟糕的主意!
CRC32并非为哈希目的而设计,其分布很可能不均匀,因此使其成为相对较差的哈希码。此外,其“混淆”能力相对较弱,使其成为单向哈希的非常不良选择,例如在加密应用中使用。
[BRB:我正在寻找相关的在线参考文献...]
谷歌搜索关键词[CRC32 distribution]的第一条结果似乎证实了这一点:
评估 CRC32 用于哈希表
编辑:上面引用的页面,实际上提供了关于查找哈希函数的良好基础。
快速阅读这篇文章,确认了总体上CRC32通常不应该用作哈希函数的结论,然而,根据哈希的特定目的,可能可以将CRC32的某些部分用作哈希码。
其他答案提到的文章基于有缺陷的crc32代码得出了错误的结论。 谷歌的排名算法目前不是基于科学准确性而排名的。
与参考文章“评估哈希表的CRC32”的结论相反,CRC32和CRC32C适用于哈希表使用。 作者的示例代码在crc32表生成方面存在错误。修复crc32表后,使用相同的方法得到令人满意的结果。此外,CRC32指令的速度使其成为许多场景下的最佳选择。使用CRC32指令的代码峰值速度比最佳软件实现快16倍。(请注意,CRC32与英特尔指令实现的CRC32C不完全相同)。
CRC32显然不适用于加密用途。(32位可以被暴力破解)。