我可以信任密钥生成过程而不检查重复项吗?
Can i trust on a key generation process without check for duplicates?
我正在使用一个程序在用户个人资料图片上命名,我担心发生冲突。
我使用的名称模式如下:
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,并使用某种形式的散列器对其进行散列。
请参阅 here 了解 PHP 中的散列。
我正在使用一个程序在用户个人资料图片上命名,我担心发生冲突。 我使用的名称模式如下:
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,并使用某种形式的散列器对其进行散列。
请参阅 here 了解 PHP 中的散列。