之前我写了一个随机字符串生成器,它使用mt_rand()函数在一个字符串中选择第n个字符,直到达到所需的长度。
public function getPassword ()
{
if ($this -> password == '')
{
$pw = '';
$charListEnd = strlen (static::CHARLIST) - 1;
for ($loops = mt_rand ($this -> min, $this -> max); $loops > 0; $loops--)
{
$pw .= substr (static::CHARLIST, mt_rand (0, $charListEnd), 1);
}
$this -> password = $pw;
}
return $this -> password;
}
(CHARLIST是一个包含密码字符池的类常量。$min和$max是长度限制)
今天,在研究完全不同的东西时,我偶然发现了以下代码:
function generateRandomString ($length = 10) {
return substr(str_shuffle ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
}
这个方法实现了与我的循环 mt_rand() 的代码相同的效果,只是用了一行。我非常喜欢它,因为代码越少越好。 :)
但是当我查阅 PHP 手册中的 str_shuffle 时,发现文档内容比较简洁。我真正想知道的一件事是,它使用什么算法来生成随机数?手册没有提到获取洗牌字符串所进行的随机化类型是什么。如果它使用 rand() 而不是 mt_rand(),那么坚持使用我当前的解决方案可能会更好。
因此,我想知道 str_shuffle 如何随机排列字符串。它使用 rand() 还是 mt_rand()?我正在使用我的随机字符串函数来生成密码,因此随机性的质量很重要。
更新:如已指出的,str_shuffle 方法与我已经使用的代码并不等价,并且由于字符串的字符保持相同,只是其顺序改变,因此会更不随机。然而,我仍然好奇 str_shuffle 函数如何对其输入字符串进行随机化。
str_shuffle()
的版本不会有任何重复,所以即使RNG相同,它也不太随机。 - Barmarstr_shuffle()
在内部使用rand()
。它是一个弱 PRNG,可预测,并且只有 2^32 种可能的输出。 - Scott Arciszewski