【问题标题】:How to check hash collision如何检查哈希冲突
【发布时间】:2012-03-19 00:42:17
【问题描述】:

我在 php 中创建了一个从数字(id)生成散列的函数,我需要检查是否不会发生冲突(两个或多个 id 具有相同的散列)。 我可以使用哪个函数来验证下一个 99999999 id 中不会发生冲突? 谢谢!

【问题讨论】:

  • 一个循环?.........
  • 每个哈希函数都有冲突。如果你想要两个随机项目具有相同哈希的概率,你需要数学。
  • @JochenRitzel:人们似乎总是认为,出于某种原因,但这不一定是真的。请参阅问题"Perfect Hash Function for Human Readable Order Codes"。 (当然,如果合法输入的数量大于合法输出的数量,则必须存在冲突;但如果 OP 只需要 0 到 99,999,999 之间的唯一性,那么情况就不太可能了。)
  • 正如他们所说,这不是 php 问题,而是数学问题

标签: php collision-detection collision


【解决方案1】:

如果您的哈希函数按预期工作,并且始终为相同的输入生成相同的输出。而且您的输入仅限于 99999999 个数字,您可以简单地为这些数字生成哈希并验证没有重复。

虽然很好的解决方案是从数学上证明您的哈希函数将为这些数字产生独特的结果。

【讨论】:

    【解决方案2】:

    如果哈希可以是完全随机的,请尝试使用其中的当前时间戳作为附加随机化器。例如:

    $hash = sha1(microtime() * rand(1, 9999));
    

    出现重复的可能性很小。此外,尝试将数据库字段设置为 UNIQUE 字段,确保不可能出现重复的 INSERT。然后,为了完成任务,您可以创建一个循环尝试直到成功,如下所示:

    // SHA1 values shouldn't need escaping, but it doesn't really hurt to be extra sure :)
    $query = "INSERT INTO `table` (`hash`) VALUES('" . mysql_real_escape_string($hash) . "')";
    
    // Let's try the insert with a max of 10 random hashes
    $tries = 10;
    while(mysql_query($query) !== true) {
        if($tries <= 0) {
            break; // Something is really failing, stop trying!
        }
    
        // If this point is reached, apparantly a duplicate was created. Try again.
        $hash = sha1(microtime() * rand(1, 9999));
    
        // Decrement the tries counter.
        $tries--;
    }
    

    【讨论】:

    • 如果您以这种方式生成哈希,您将简单地找到随机数的 sha1 摘要。他想开发一个函数,该函数将根据数字创建消息摘要,类似于 sha1 的工作方式。他在问他如何证明它在有限范围内是独一无二的(我认为)
    • 每次使用散列函数时,散列必须产生相同的结果。根据时间添加(坏)伪随机种子会破坏它!
    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 2013-09-01
    • 2015-04-07
    • 2013-01-10
    • 2016-07-30
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多