【问题标题】:Hash function combining - is there a significant decrease in collision risk?哈希函数组合 - 碰撞风险是否显着降低?
【发布时间】:2009-08-24 16:27:54
【问题描述】:

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

【问题讨论】:

    标签: hash collision crc32 adler32


    【解决方案1】:

    像这样将它们串联起来是没有意义的。您正在将一个 32 位空间散列到另一个 32 位空间。

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

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

    adler32(数据)

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

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

    无论您使用哪种算法 会有一些虚假的机会 积极的一面。但是,您可以减少 这些机会相当大 通过使用两种不同的散列 算法。如果你要计算 并存储 CRC32 和 Alder32 为每个 url,几率为 两个哈希同时发生冲突 对于任何给定的网址对 减少。

    当然,这意味着存储两倍 很多信息是其中的一部分 你原来的问题。然而,有 是存储两组哈希的一种方式 需要最少的数据 内存(10kb左右)同时给予 几乎相同的查找性能(15 微秒/查找与 5 相比 微秒)作为 Perl 的哈希值。

    【讨论】:

    • +1 用于明确说明第二个哈希无法消除第一个哈希中的冲突。 :)
    • 没错!感谢您快速而有帮助的回答。我严重误解了那个评论。为了我的目的,我可能会坚持使用快速、快速且“脏”的 CRC32。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2013-05-30
    • 2010-11-16
    • 2014-05-07
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多