【发布时间】:2012-12-14 07:41:33
【问题描述】:
不久前,我编写了一个随机字符串生成器,它使用字符串中的第 mt_rand() 个字符构建字符串,直到达到所需的长度。
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相同,随机性也较小。 -
你是对的,刚刚意识到这一点。
-
@Barmar 换句话说 RTFS?这充其量只是一个陈词滥调的答案。
-
这就是为什么我把它放在评论中,而不是答案。
-
str_shuffle()在内部使用rand()。这是一个弱 PRNG,它是可预测的,并且它只有 2^32 个可能的输出。
标签: php string random passwords