我一直认为我的代码生成了非常随机的字符串,但我已经按F5大约10分钟,我一次显示10个字符串,我有三个重复,UNIBON,ZANOPE和ZOTAXS。
任何人都可以解释为什么会这样,当我的代码有26 ^ 6种可能性时?
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pass = '';
for ($i = 0; $i < $len; $i++){
$pass .= $chars[(rand() % strlen($chars))];
}
return $pass;
非常感谢任何建议。
由于
使用mt_rand第一个副本平均需要10到60秒,这似乎没关系吗?
echo 'start: '.date('H:i:s');
for ($i = 1; ; $i++) {
$testarr[] = passGen(6);
$new = passGen(6);
if (in_array($new,$testarr)){
echo '<br>end: '.date('H:i:s');
echo '<br>string: '.$new;
echo '<br>count: '.count($testarr);
break;
}
}
答案 0 :(得分:1)
为什么不散列随机数,然后从散列中获取随机子串呢?
答案 1 :(得分:0)
你应该试试这个:
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pass = '';
$length = strlen($chars)-1;
for ($i = 0; $i < 10; $i++){
$randomNumber = rand(0,$length);
$pass .= substr($chars,$randomNumber,1);
}
return $pass;
答案 2 :(得分:0)
您应该使用mt_rand。
mt_rand
比rand
更好。从PHP手册
许多旧libcs的随机数生成器具有可疑或未知的特征并且速度很慢。默认情况下,PHP使用带有rand()函数的libc随机数生成器。 mt_rand()函数是替代它的替代品。它使用具有已知特征的随机数生成器,使用»Mersenne Twister,它将产生比平均libc rand()提供的速度快四倍的随机数。
除此之外,您可以使用此函数来生成具有您希望的长度的随机字符串;)
function random($length = 10)
{
$chars = 'BCDFGHJKLMNPQRSTVWXYZAEIUO';
for ($i = 0; $i < $length; $i++)
{
$pass .= ($i%2) ? $chars[mt_rand(19, 25)] : $chars[mt_rand(0, 18)];
}
return $pass;
}
此功能也可以轻松用于生成CAPTCHA;)
答案 3 :(得分:0)
我认为这只是野兽的本性。将长度增加到7并添加更多字符,重复的概率会下降。这是我以前测试的:
<?php
$len = 6;
# Remove characters that can be mistaken for others, I,0,L,1 and 0
$chars = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
for ($j=0;$j<100000;$j++) {
$pass = '';
for ($i = 0; $i < $len; $i++){
$pass .= $chars[(rand() % strlen($chars))];
}
if(isset($saved[$pass])) {
echo "Password \"$pass\" on iteration $j has duplicate(s) from iteration(s) " . implode(',',$saved[$pass]) . "\n";
}
$saved[$pass][] = $j;
}
?>
使用mt_rand()vs rand()并没有多大改变输出