PHP:生成随机代码,排除(0,1,O和L)


PHP: Generate random Code excluding (0, 1, O and L)

我正在尝试使用以下规则生成随机凭证代码:

字母数字组合 5 个字符,大写(A-Z、0-9 和去掉 1、0、I、O)。

这是我的尝试

<?php
function generateRandomString($length = 5) {
    return substr(str_shuffle("23456789ABCDEFGHIJKMNPQRSTUVWXYZ"), 0, $length);
}

echo generateRandomString();
?>

但我不确定是否有更好的方法来做到这一点

如果你需要多次调用这个函数,你当前的实现会非常慢,因为它使用的随机函数调用比必要的要多得多(如果$length <32)。此外,如果允许的字符集小于结果中的字符数,则当前的实现也将返回错误的结果。而且您的实现不允许在结果中重复字符,但在规范中不禁止重复字符。

更准确的解决方案是使用 array_rand()

function generateRandomString($length = 5) {
  $allowed = str_split('23456789ABCDEFGHIJKMNPQRSTUVWXYZ'); // it is enough to do it once
  $res = '';
  foreach (array_rand($allowed, $length) as $k)
    $res .= $allowed[$k];
  return $res;
}
function generateRandom($length = 5) {
    $possibleChars = '123456789ABCDEFGHJKMNPQRSTUVWXYZ';
    $rndString = '';
    for ($i = 0; $i < $length; $i++) {
        $rndString .= $possibleChars[rand(0, strlen($possibleChars) - 1)];
    }
    return $rndString;
}
echo generateRandom();

在这里,您可以定义要在随机字符串中使用的字符。

函数的问题在于,每次调用只会使用任何字符 1 次。它并不是真正的随机。随机字符串的长度也将限制为您拥有的字符数。

例如:AAAAA 不适用于您的函数,而我的函数则不可能。

如果您需要比字符集更长的字符串,该方法将失败。请您尝试下面的代码;

<?php
    function generateRandomString($length = 5) {
        $chars = "23456789ABCDEFGHIJKMNPQRSTUVWXYZ"; //Your char-set
        $charArray = str_split($chars); //Your array representation of chars
        $charCount = strlen($chars); //Your char-set length
        $result = "";
        //Loop throught required `$length`
        for($i=1;$i<=$length;$i++)
        {
            $randChar = rand(0,$charCount-1); //Pick a random char in range of our chars
            $result .= $charArray[$randChar]; //Concatenate picked char to result
        }
        return $result;
    }

    echo generateRandomString(75);
?>

下面是一个工作示例:https://ideone.com/D1EQ9T希望这有帮助。