假設場景:
從特定的字符庫中取一個定常的隨機字符串
長度:`$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慢的。