用PHP创建随机序列

用PHP创建随机序列,php,Php,我想有一个随机序列在我的网站上创建每次有人访问 序列号的格式应为XXXXX-XXXXX-XXXXX-XXXXX X表示随机数或大写字母。 不幸的是,我不知道怎么做。谁能帮我一下吗 例如,随机串行输出可以是:3WT4A-NB34O-JU87P-B3UHS 非常感谢 在SO有很多这样的答案: 您可以使用此处提到的随机字符串生成器,或者使用它一次获得一个20个字母的字符串,然后插入破折号,或者可以调用它4次以获得5个字母的结果。当然有更好的方法,但这是第一个想到的方法: $chars = arra

我想有一个随机序列在我的网站上创建每次有人访问

序列号的格式应为XXXXX-XXXXX-XXXXX-XXXXX

X表示随机数或大写字母。


不幸的是,我不知道怎么做。谁能帮我一下吗

例如,随机串行输出可以是:3WT4A-NB34O-JU87P-B3UHS



非常感谢

在SO有很多这样的答案:


您可以使用此处提到的随机字符串生成器,或者使用它一次获得一个20个字母的字符串,然后插入破折号,或者可以调用它4次以获得5个字母的结果。

当然有更好的方法,但这是第一个想到的方法:

$chars = array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
$serial = '';
$max = count($chars)-1;
for($i=0;$i<20;$i++){
    $serial .= (!($i % 5) && $i ? '-' : '').$chars[rand(0, $max)];
}
$chars=数组(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
$serial='';
$max=计数($chars)-1;

对于($i=0;$i有很多方法可以实现这一点。一个简单的方法是:

$string1 = substr(md5(uniqid(rand(), true)), -5, 5);
$string2 = substr(md5(uniqid(rand(), true)), -5, 5);
$string3 = substr(md5(uniqid(rand(), true)), -5, 5);
$string4 = substr(md5(uniqid(rand(), true)), -5, 5);
$serial  = sprintf('%s-%s-%s-%s', $string1, $string2, $string3, $string4);
有更好的方法生成随机字符串,但这将为您提供所需的基本功能。

试试这个

function rand_string( $length ) {
    $length += 3;
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
    $str= "";
    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
            if($i == 5 || $i == 11 || $i == 17 )
                $str .= '-';
            else
                $str .= $chars[ rand( 0, $size - 1 ) ];
    }

    return $str;
}

$getstring = rand_string(20,5);
echo $getstring;
函数随机字符串($length){
$length+=3;
$chars=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyzo123456789”;
$str=”“;
$size=strlen($chars);
对于($i=0;$i<$length;$i++){
如果($i==5 | |$i==11 | |$i==17)
$str.='-';
其他的
$str.=$chars[rand(0,$size-1)];
}
返回$str;
}
$getstring=rand_string(20,5);
echo$getstring;

最简单的解决方案是这样的

$tokens = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

$serial = '';

for ($i = 0; $i < 4; $i++) {
    for ($j = 0; $j < 5; $j++) {
        $serial .= $tokens[rand(0, 35)];
    }

    if ($i < 3) {
        $serial .= '-';
    }
}

echo $serial;

如果您仅仅因为唯一性而想使用此序列,您也可以尝试使用,如这里的一个答案所述:

另一种方法是将四个段作为基数36中的随机数进行计算

function generate_serial() {
    static $max = 60466175; // ZZZZZZ in decimal
    return strtoupper(sprintf(
        "%05s-%05s-%05s-%05s",
        base_convert(random_int(0, $max), 10, 36),
        base_convert(random_int(0, $max), 10, 36),
        base_convert(random_int(0, $max), 10, 36),
        base_convert(random_int(0, $max), 10, 36)
    ));
}

看看和。嘿
($i%5?“-”:”)
不正确,它将每个破折号放在每两个字符之后。请您解决这个问题,好吗?很抱歉。逻辑有点颠倒。它现在可以工作了。我越看这个答案,我越喜欢它。这是一种处理问题的绝妙方法,而不必依赖笨拙的迭代。此外,
mt_rand
非常重要比兰德快。