8

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

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

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


不幸的是,我不知道该怎么做。有人可以帮我吗?

因此,例如随机串行输出可能是:3WT4A-NB34O-JU87P-B3UHS 非常


感谢!

4

7 回答 7

12

另一种方法是将四个段计算为以 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)
    ));
}
于 2012-05-01T18:17:03.630 回答
6

最直接的解决方案是这样的。

$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;

样本输出:

51C8A-P9NZD-UM37Q-YKZHO
于 2012-05-01T17:37:15.467 回答
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)];
}

05/26/13 编辑:建议将Count函数保持在循环之外。这样做的原因是,当您可以简单地运行一次时,您不想在每次迭代中花费额外的时钟周期来运行此函数。

于 2012-05-01T17:27:11.727 回答
4

有很多方法可以解决这个问题。一种简单的方法是:

$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);

有更好的方法来生成随机字符串,但这将为您提供您正在寻找的基本功能。

于 2012-05-01T17:27:40.027 回答
2

如果你想使用这个序列只是因为唯一性 - 你也可以尝试使用UUID v4,如这里的答案之一所述:PHP function to generate v4 UUID

于 2012-05-01T17:39:08.483 回答
2

尝试这个

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;
于 2012-05-01T17:35:51.297 回答
1

SO上有很多这样的答案:https ://stackoverflow.com/a/4356295/1091195

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

于 2012-05-01T17:22:10.107 回答