假设场景:
从特定的字符库中取一个定常的随机字符串
长度:`$str_len = 20;`
字符库:`$char_lib = '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY';`
期望结果:`$res = 'L47Ku8MRBcq35kvhAGRV';`
**介绍两种方法:1.循环+rand随机数;2.PHP内置函数随机打乱字符串**
**给定条件:**
```
$str_len = 20;
$char_lib = '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY';
```
##**for循环+rand随机数**
```php
function str_get_rand($str_len, $char_lib){
$res = '';
for($i = 0; $i < $str_len; $i++){
//从字符库中随机一个位置[数字]
$str_loc = rand(0, strlen($char_lib) - 1);
$res .= $char_lib[$str_loc];
}
return $res;
}
```
##**PHP内置函数substr+str_shuffle**
```php
function str_get_rand_nature($str_len, $char_lib){
return substr(str_shuffle($char_lib), -$str_len);
}
```
**备注**
> 这种方法有个致命的缺点就是:生成的结果字符串中不会出现重复值
##**其他方法**
1.随机33-126之间的整数,用对照ACSII码表的方式生成
```php
function str_get_rand_chr($str_len){
$res = '';
for($i = 0; $i < $str_len; $i++){
$res .= chr(mt_rand(33, 126));
}
return $res;
}
```
##**性能比较**[PHP:5.4.33; Apache:2.4.9]
以上两段代码分别执行10W次,得到的时间大概是:
|执行次数|每次循环数|for循环|str_shuffle|
|--|--|--|
|1|10W|float(1.0182211399078)|float(0.24653792381287)|
|2|10W|float(1.0166230201721)|float(0.24114298820496)|
|3|10W|float(1.0591399669647)|float(0.24626517295837)|
|4|10W|float(1.0441348552704)|float(0.24370694160461)|
|5|10W|float(1.0388350486755)|float(0.28679704666138)|
**备注**
> for循环中的rand较mt_rand速度较慢,经测试使用mt_rand方法的for循环,10W次的时间平均值在1.0左右,还是比str_shuffle慢的。