如何检查哈希冲突

时间:2012-03-18 15:01:24

标签: php collision-detection collision

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

2 个答案:

答案 0 :(得分:3)

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

虽然好的解决方案是用数学方式证明你的哈希函数会为这些数字产生唯一的结果。

答案 1 :(得分:0)

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

$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--;
}