我正在尝试使用以下规则生成随机凭证代码:
字母数字组合 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希望这有帮助。