生成随机唯一代码 - php

时间:2018-01-03 10:53:07

标签: php

如何生成随机代码/ PIN。我读了PHP的 rand() mt_rand()函数,它似乎做得很好,但我发现有重复。

有人可以建议或演示在PHP中实现这一目标的更好方法吗?

我的代码:

$size = 1000; //handcoded pin-size

function generatePIN($size =500){
$pins = array(); $i = 0; //ini counter
//my basic algorithm for generating unique pin codes
    while ($i < $size){
        $pin = (mt_rand(100000,999999));
        $pins[] = $pin;
        ++$i;
    }
sort($pins);//sort in lowest to highest
return array_unique($pins);//remove duplicates
}

//call it and print or store in database
 $pins = generatePIN($size);
 foreach ($pins as $pin) {
    echo $pin.'<br>';
 }

谢谢。

2 个答案:

答案 0 :(得分:0)

真正的随机总是有机会创建副本,因为它对先前给定的randoms是无条件的。

为了减少重复次数,您可以使用mt_rand(10000000,99999999)增加随机间隔。

或者您可以检查您的号码是否重复:

while ($i < $size){
    $pin = (mt_rand(100000,999999));
    if (array_search($pin, $pins) === FALSE) {
        $pins[] = $pin;
        ++$i;
    }
}

与随机区间相比,较大的$size表现较差,如果$size大于它,则会创建无限循环。

答案 1 :(得分:0)

在循环中添加生成的值解决了问题是每天调用它非常有效。无论大小多长。

$size = 1000; //handcoded value

function generatePIN($size =500){
    $pins = array(); $i = 0;
    //my basic algorithm for generating unique pin codes
        while ($i < $size){
            $pin = (mt_rand(100000,999999)) + (mt_rand(1000,9999)) + strtotime(date('Y-m-d', strtotime('+'.$i.' week')));
            $pins[] = $pin;
            ++$i;
        }
    sort($pins);//sort in lowest to highest
    return array_unique($pins);//remove duplicates
    }

//store in database or print it
    $pins = generatePIN($size);
    foreach ($pins as $pin) {
    echo $pin.'<br>';
    }

    echo "<hr />";
    echo count($pins);