我可以信任密钥生成过程而无需检查重复项吗?

时间:2015-01-08 19:53:25

标签: php key probability probability-theory

我正在使用流程在用户个人资料图片上添加名称,并且我害怕发生冲突。 我使用的名称模式如下:

9999999_9999999_9999999

因此图像的名称如下:

4533381_1284948_8023255.jpg

整数的范围是从 1.000.000 9.999.999 是否需要检查用户配置文件图像目录中是否已存在具有相同名称的图像? (假设所有图像都位于同一目录级别)。

使用php函数mt_rand(1000000,9999999);

生成整数

2 个答案:

答案 0 :(得分:1)

在您的情况下碰撞的可能性非常低(尽管可能)。

  • 计算图像名称的所有可能值:(9999999-1000000+1)^3 == 7.29 * 10^20

    提示:您可以通过生成09999999之间的数字来增加此值,并在转换为字符串时用零填充它们,例如:sprintf("%07d", $number)

  • mt_rand是一个相对优秀的随机生成器。

碰撞可能永远不会发生。


但是,如果您在应用程序的上下文中很容易,您可以执行检查名称未被占用,如果不是,则只需重新生成随机名称办法。

一种do { $name = generate_name(); } while(is_occupied($name));循环。


请注意,此解决方案比评论中提出的确定性散列更安全。

原因是哈希冲突也是可能的,如果它发生了,那么你就完成了 - 它是确定性的,你没有可能产生另一个随机的。

或者您必须使用哈希函数链来处理冲突。这意味着类似的do-while循环,但稍微复杂一些,涉及计算散列的数据和计数器(影响散列计算)。更多代码没有任何好处,IMO。

答案 1 :(得分:0)

简单回答:不。

答案很长:即使使用32位数字和字母的随机字符串,您最终也可能会发生碰撞。有人评论说,你应该尝试使用与用户相关的东西,比如他们的用户ID,并使用某种形式的哈希来哈希。

请参阅here了解PHP中的散列。