一、随机函数和字符池

当我们要生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生成php随机数,从字符池中随机选取字符,最后拼凑出需要的长度。

function randomkeys($length) { 
 $pattern = '1234567890abcdefghijklmnopqrstuvwxyz 
    ABCDEFGHIJKLOMNOPQRSTUVWXYZ;
 for($i=0;$i<$length;$i++) { 
  $key .= $pattern{mt_rand(0,35)}; //生成php随机数 
 } 
 return $key; 
} 
echo randomkeys(8);

二、使用 chr() 函数

另一种用PHP生成随机数的方法:利用chr()函数,省去创建字符池的步骤。

function randomkeys($length){ 
 $output=''; 
 for ($a = 0; $a<$length; $a++) { 
  $output .= chr(mt_rand(33, 126)); //生成php随机数 
 } 
 return $output; 
} 
echo randomkeys(8);

在第二个php随机函数里,先用mt_rand()生成一个介于33到126之间的php随机数,然后用chr()函数转化成字符。第二个函数和第一个函数功能相同,而且更简洁。如果不需要特殊字符的话还是直接写在字符池中比较好。

三、示例

1. 使用 PHP 生成唯一订单号 License Key

<?php
function create_random_string($count, $length, $sperator) {
    $result = array();
    $random_string = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    for ($i = 0; $i < $count; $i++) {
        $part_string = '';
        for ($j = 0; $j < $length; $j++) {
            $part_string .= $random_string[mt_rand(0, strlen($random_string)-1)];
        }
        $result[] = $part_string;
    }
    return implode($sperator, $result);
}
$license_key = create_random_string(5, 5, '-');

入库前再检查一次数据库中是否已经存在 License Key,防止出现重复 Key。

2. 生成32位唯一字符串

$uniqid = md5(uniqid(microtime(true),true));
echo $uniqid;