使用CRC32C作为基础可以构建一个“好”的哈希函数吗?

时间:2010-04-22 21:43:18

标签: hash intel sse crc32

鉴于SSE 4.2(Intel Core i7& i5部分)包含CRC32指令,研究是否可以构建更快的通用散列函数似乎是合理的。根据{{​​3}},只有16位CRC32均匀分布。那么还有什么其他转变才能克服这个问题呢?

更新 这个怎么样?只有16位适合散列值。精细。如果你的桌子是65535或更低,那么很棒。如果不是,则通过Nehalem POPCNT(填充计数)指令运行CRC值以获得设置的位数。然后,将其用作表数组的索引。如果您的表位于1mm条目以南,则此方法有效。我敢打赌,性能最好的哈希函数更便宜/更快。既然this具有CRC32内在性,那么它应该很容易测试......如果我只有大量的业余时间来处理它。

大卫

5 个答案:

答案 0 :(得分:17)

答案 1 :(得分:14)

其他答案中提到的文章根据错误的crc32代码得出了错误的结论。 Google的排名算法尚未根据科学准确性进行排名。

与所提及的文章"Evaluating CRC32 for hash tables"相反, CRC32和CRC32C可用于哈希表使用。作者的示例代码在crc32表生成中有一个错误。修复crc32表,使用相同的方法得到令人满意的结果。此外,CRC32指令的速度使其成为许多环境中的最佳选择。使用CRC32指令的代码在峰值时比最佳软件实现快16倍。 (注意,CRC32与intel指令实现的CRC32C不完全相同。)

CRC32显然不适合加密使用。 (32位是暴力的笑话)。

答案 2 :(得分:4)

是。 CityHash 1.0.1包含一些使用CRC32指令的新“好哈希函数”。

答案 3 :(得分:1)

只要你没有使用加密哈希,它就可以正常工作。

答案 4 :(得分:1)

出于加密目的,CRC32是一个糟糕的基金,因为它是线性的(在向量空间 GF(2)^ 32 上)并且很难纠正。它可能适用于非加密目的。

但是,最近的英特尔内核具有AES-NI指令,基本上在两个时钟周期内执行1/4的AES块加密。它们可在最新的i5和i7处理器上使用(有关详细信息,请参阅Wikipedia page)。 这个看起来是构建加密哈希函数的良好开端(对于加密也有好处的哈希函数也适用于其他任何东西)。

实际上,SHA-3 "round 2" candidatesECHO哈希函数)中至少有一个是围绕AES元素构建的,因此AES-NI操作码可以提供非常显着的性能提升。 (不幸的是,在没有AES-NI指令的情况下,ECHO性能有点糟糕。)