我正在使用一个过程在用户个人资料图像上命名,我害怕碰撞。我正在使用的名称模式如下:
9999999_9999999_9999999
所以图像被命名为:
4533381_1284948_8023255.jpg
整数范围为1.000.000到9.999.999 是否需要检查用户配置文件图像目录中是否已存在同名图像?(假设所有图像都位于同一目录级别)。
整数是使用 php 函数生成的mt_rand(1000000,9999999);
我正在使用一个过程在用户个人资料图像上命名,我害怕碰撞。我正在使用的名称模式如下:
9999999_9999999_9999999
所以图像被命名为:
4533381_1284948_8023255.jpg
整数范围为1.000.000到9.999.999 是否需要检查用户配置文件图像目录中是否已存在同名图像?(假设所有图像都位于同一目录级别)。
整数是使用 php 函数生成的mt_rand(1000000,9999999);
在您的情况下,发生碰撞的可能性非常低(尽管可能)。
计算图像名称的所有可能值:(9999999-1000000+1)^3 == 7.29 * 10^20
.
提示:0
您可以通过在 和 之间生成数字并9999999
在转换为字符串时用零填充它们来增加此值,例如:sprintf("%07d", $number)
mt_rand
是一个比较好的随机生成器。
碰撞可能永远不会发生。
但是,如果在您的应用程序的上下文中很容易,您可以实现名称未被占用的检查,如果不是,只需以相同的方式重新生成随机名称。
一种do { $name = generate_name(); } while(is_occupied($name));
循环。
请注意,此解决方案比评论中提出的确定性哈希更安全。
原因是哈希冲突也是可能的,如果它发生了,那么你就完成了——它是确定性的,你不可能产生另一个随机数。
或者您必须使用一系列哈希函数来应对冲突。这意味着一个类似的 do-while 循环,但稍微复杂一些,涉及计算哈希的数据和一个计数器(影响哈希计算)。更多没有好处的代码,IMO。
简单的回答:没有。
长答案:即使使用 32 位随机数字和字母字符串,您最终也可能会发生碰撞。正如有人评论的那样,您应该尝试使用与用户相关的东西,例如他们的用户 ID,并使用某种形式的散列器对其进行散列。
请参阅此处了解 PHP 中的散列。