【发布时间】:2019-12-25 00:50:10
【问题描述】:
所以我在 PHP 中有一个相当简单的函数,它可以呈现 10 个字符长的订单 ID:
function createReference($length = 10)
{
$characters = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789';
$string = '';
for ($i = 0; $i < $length; $i++) {
$string .= $characters[rand(0, strlen($characters) - 1)];
}
return $string;
}
但是,今天在第 154020 条表记录上,它生成了与之前的订单 ID(即表中的第 144258 条记录)相同的 10 个字符的 ID,并尝试插入它。由于我对该列有UNIQUE 限制,因此我收到了一个错误并收到了来自该列的通知。
根据我的计算,上面的脚本创建了34^10 = 2.064.377.754.059.776不同的可能性。
我读过一些关于 rand() 和 mt_rand() 做不同事情的东西,但这不应该是 PHP 7.1+ 的问题。该脚本在PHP 7.3 上运行。
那么我现在应该买彩票吗,或者这里使用的伪随机性有什么可预测的吗?如果是这样,有什么解决方案可以更好地分配?
【问题讨论】:
-
不太可能的事情偶尔会发生。
-
@Barmar 这不是使用
rand()(非加密安全)和random_int()(加密安全)之间的区别吗?我一直在阅读一些关于加密安全 RNG 的内容,也许rand()函数更有可能重新生成相同的数字集。 -
这当然是可能的。