哈希函数组合 - 碰撞风险是否显着降低?

时间:2009-08-24 16:27:54

标签: hash collision crc32 adler32

有没有人知道通过组合散列函数是否有降低碰撞概率的真正好处?我特别需要知道32位散列,即组合Adler32和CRC32。 基本上,adler32(crc32(data))会产生比crc32(数据)更小的碰撞概率吗? 最后一条评论here给出了一些有利于组合的测试结果,但没有提到任何来源。 就我的目的而言,碰撞并不重要(即任务不涉及安全性),但如果可能的话,我宁可尽量减少概率。 PS:我刚开始在哈希的精彩世界里,做了很多关于它的阅读。对不起,如果我问一个愚蠢的问题,我还没有获得正确的“哈希方言”,可能我的谷歌搜索也很差。 感谢。

1 个答案:

答案 0 :(得分:6)

将它们组合在一起是没有意义的。您正在将一个32位空间散列到另一个32位空间。

在第一步中发生crc32碰撞的情况下,最终结果仍然是碰撞。然后,在adler32步骤中添加任何潜在的碰撞。所以它不会变得更好,只能是相同或更糟。

为了减少冲突,您可以尝试单独使用两个哈希来创建64位输出空间:

adler32(数据)<< 32 | CRC32(数据)

这样做是否有显着的好处,我不确定。

请注意,您提到的原始评论是独立存储哈希值:

  

无论您使用哪种算法   会有一些虚假的机会   阳性。但是,你可以减少   这些机会相当大   通过使用两个不同的散列   算法。如果你要计算   并存储CRC32和   每个网址的Alder32,赔率为   两个哈希的同时碰撞   对于任何给定的网址是非常大的   降低。

     

当然这意味着存储两次   许多信息是其中的一部分   你原来的问题。但是,那里   是一种存储两组哈希的方法   数据使其需要最小化   给予记忆(10kb左右)   几乎相同的查找性能(15   microsecs / lookup与5相比   微软)作为Perl的哈希。