我指的是PHP随机字符串生成器上答案中的函数(我已经删除了默认的$length参数)。
因此,此代码使用该函数,但由于某种原因,如果运行此代码,您将看到字符串在数组中多次出现!那么,如果这是真正随机的,我能产生这些结果吗?我需要修改一些东西来产生真正随机的字符串吗?
function generateRandomString($length) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
$i = 0;
while ($i < 5000){
$r = '';
$r = generateRandomString(8);
$arr[$r][$i] = $r;
$i++;
}
foreach ($arr as $key=>$rand){
if(count($rand) > 1){
echo "$key has ".count($rand).' results<br>';
}
}举例结果:
ASCn2Db1 has 2 results
4ceXoUgh has 2 results
fCdzjEAV has 2 results
QRkXxAUJ has 2 results发布于 2015-08-13 10:03:38
实际上,我遇到了PHP:如何生成一个随机的、唯一的字母数字字符串?,它似乎回答了我的问题。简而言之,我们使用openssl_random_pseudo_bytes作为函数。当运行4个字符时,我得到了1x碰撞,但在5个字符上,我没有生成任何字符。所以8岁的时候我会没事的。
发布于 2015-08-13 09:45:56
随机并不是唯一的。掷出一个骰子,你就会多次得到相同的号码。
发布于 2015-08-13 15:30:49
我提供了对你在问题中提到的问题的回答,但是它被不安全的答案所掩盖,我并不奇怪每个人都会错过它。
代码中导致大量重复值的错误如下所示:
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}问题是rand()。如果你想要一个高质量的PHP随机字符串生成器,你需要使用一个更好的随机数发生器来驱动它。你在这里有三个不错的选择:
TL;DR使用random_int(),mt_rand().
即使使用安全的随机数生成器,如果您有短字符串和足够大的样本大小,由于生日问题,碰撞是不可避免的。。使用较长的字符串,它们就会少得多。
https://stackoverflow.com/questions/31984634
复制相似问题