【问题标题】:Hash collision worries哈希碰撞担忧
【发布时间】:2012-04-30 02:52:04
【问题描述】:

如果我有一个系统,其中哈希是从 100 万种可能性的总排列中生成的。如果有 10% 的机会发生碰撞,我应该担心生成算法运行 5 次吗?

  • 我有一个类似于 jsfiddle 的系统,用户可以在我的服务器上“保存”一个文件。现在我使用的是 '23456789abcdefghijkmnopqrstuvwxyz',它是 33 个字符,文件长度是 4 个字符,总共有 33^4 = 1,185,921 的可能性。
  • “文件名”是随机生成的,如果发生冲突,它会重新运行以获取另一个文件名。使用 birthday paradox calculator 我可以看到,在我有 500 个条目后,我有 10% 的机会发生冲突。
  • 我连续 5 次以上发生碰撞的可能性有多大? 4 呢?
  • 有没有办法解决这个问题?我应该担心吗? 5000 个条目后会发生什么?
  • 是否有任何程序可以通过任意输入来解决这个问题?

【问题讨论】:

  • 在我看来你的keyspace太小了,为什么只有4个字符?对于短网址?
  • 嗯 - 你不能使用生日悖论,用可能的哈希数替换 365 来得到你的结果吗?我想这会给你机会 - 对于 5000 个哈希,你会赌钱。
  • @ExternalUse 我认为这就是 OP 所做的。如果您将 365 替换为 1185921 并尝试生成 500 个值,则两者相同的几率不到 10%。
  • 哦 - 我误读了这个问题。他想知道它连续发生的概率。为此,我的回答是:几率是一样的。
  • @ExternalUse 硬币落在一侧的机会是 1/2,但它两次落在一侧的概率是 (1/2)^2 = 1/4

标签: php algorithm hash probability hash-collision


【解决方案1】:

我的数学有点生疏,请耐心等待。
连续发生 x 次碰撞的机会很简单:

chance of collision ^ x;  

碰撞的机会在哪里:

entries/space (which is 500/1185921 or 0.04%).

您可以在上面看到,条目越多,情况就越糟(空间越大越好)。

还要注意生日悖论可能不是你想要的。 10% 的几率是任何两个条目发生冲突的几率,而不是下一个条目发生冲突的几率。

【讨论】:

    【解决方案2】:

    我认为生日悖论计算不适用。 1185921 中的 500 个随机数完全不同的几率与拥有 500 个已知唯一数字后一个新数字不同的几率之间存在差异。

    如果您有 500 个分配的号码并随机生成一个新号码,则发生碰撞的几率为 500/1185921。使用 500 个名称,连续 4 次冲突的可能性为 (500/1185921)4-13。对于 5000 个现有文件名,新名称发生冲突的几率为 5000/1185921,连续 4 次冲突的几率为 -9。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多