PHP随机字符串生成器......不是那么随机

时间:2012-03-28 14:25:00

标签: php random

我一直认为我的代码生成了非常随机的字符串,但我已经按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;
    }
}

4 个答案:

答案 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_randrand更好。从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()并没有多大改变输出