function createStr($num = 700, $len = 6){
$numbers = range(0, 9);
$letters = range('a', 'z');
$uppers = range('A', 'Z');
$elements = array_merge($numbers, $letters, $uppers);
$n = 0;
$strings = [];
for($i = 0;$i < $num;$i++){
$str = '';
$keys = array_rand($elements, $len);
foreach($keys as $key){
$str .= $elements[$key];
}
if(in_array($str, $strings)){
$i--;
unset($str);
}else{
$strings[] = $str;
unset($str);
// echo $i. '->' .$str. "\r\n";
}
$n++;
}
print_r($strings);exit;
// echo "\r\n\r\n".$n;
}
问题:
当使用 $strings 数组保存时,在 $num = 630 以上时会造成无响应(命令行也是不出结果,一直跑),而630以下,则正常。
P.S. 目前只测了 $len = 6 的情况。
P.S.2 当使用正常的 echo 时,程序可以跑通。
1
coosir 2015-03-26 17:59:43 +08:00
我跑没问题呀,试过其他机器上跑么?PHP啥版本?
|
2
owei 2015-03-26 18:04:09 +08:00 1
为什么不用uniqid这个函数来计算
|
4
50480350 OP @owei 这个是同事测试发现的,他之前用 do...while 只能跑到 522 个,我改写了下能坚持到630,但还是不能支持更多的。。。 - -#
|
5
shiny 2015-03-26 18:22:27 +08:00
|
6
kn007 2015-03-26 18:24:45 +08:00
测试没问题,啥版本php,乃们不要黑php好伐,php是世界上最好的语言
|
11
raincious 2015-03-26 18:35:22 +08:00
@owei +1
这个问题在于array_rand给出的并不完全是随机数,所以你需要调用srand来来确保它的随机化。 我用简化过的代码进行了测试(并不保证更快) https://gist.github.com/raincious/f30728065b77293f1d3e 如果你去掉了代码里的srand,那么循环会在某处卡住,因为array_rand总是在给出之前的序列。加了srand就好多了。 http://php.net/manual/zh/function.srand.php 对于这个问题的解决方案是: 1、加上srand; 2、或者用shuffle来随机化那些数组的key,效率应该不会慢很多(如果你不是一次性批量产生巨多的话)。 |
12
50480350 OP |
13
shiny 2015-03-26 19:50:16 +08:00
每次都用 in_array search 一次 value 会导致性能下降。建议在生成完毕后再去重,或者生成的随机字符串作为 key 来保证唯一性。在 $num = 50000 的时候效果比较明显,下面是一个例子:
https://gist.github.com/3f1afdbfcc465db1dd5f.git |
14
shiny 2015-03-26 19:50:52 +08:00
|
15
magicianzrh 2015-03-27 00:23:09 +08:00
如果你只要小写么 直接random+md5方便点
比如 <?php $total = 300000; $num=0; $tmp = ""; $len = 6; mt_srand(time()); $arr = array(); while($num<$total){ if(strlen($tmp) < $len) { $tmp .=md5(mt_rand(0,mt_getrandmax())); } $str = substr($tmp,0,$len); $tmp = substr($tmp,$len); array_push($arr,$str); $num++; } echo count(array_unique($arr)); ?> |
16
50480350 OP @magicianzrh @shiny 谢谢二位,正在尝试 :)
|