🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
假设场景: 从特定的字符库中取一个定常的随机字符串 长度:`$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慢的。