作者pakker (找寻蔚蓝天空)
看板PHP
标题Re: [请益] 产生验证码
时间Mon Dec 10 19:43:37 2007
※ 引述《ottokang (猫猫的大玩偶)》之铭言:
: 原文恕删
: 这个程式也是会产生重复的验证码,只是机率非常非常很低
: 详细的机率可以用排列组合去算(就不用考我了,因为我排列组合很烂XD)
: PHP本身就有提供产生唯一验证码的功能,函数uniqid()可以做到
: 除非你在1个ms之内(百万分之一秒)同时使用uniqid()
: 不然验证码是不会重复出现的,想要避免这个问题可以用参数来做到猜不到的验证码
: 详情可以去看PHP手册uniqid()的说明
: http://www.php.net/uniqid
: 不过加上参数会导致这个函数的速度变慢,就看自己怎麽取舍了
为了验证网友的code, 只要将id的字元范围缩小, 并且减小长度,
在这边缩减成只由abc三个字元组成, 长度为3:
<?php
function genID()
{
$charset = 'abc';
$str = '';
for($i=0; $i<3; $i++)
$str .= $charset[rand(0,2)];
return $str;
}
$uniqid= array();
for($i=0; $i<27; $i++)
{
do
{
$id = genID();
} while(IsSet($uniqid[$id]));
$uniqid[$id] = true;
}
print_r($uniqid);
?>
所有的组合只有27组, 非常容易处理, 只要将27改为28,
如果程式跑得出来那就是有重复了,
但是其实是会在do-while里不断的转阿转的...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.13.238
1F:推 buganini:我之前检查是把每一笔塞进array 最後再检查 12/10 21:02
2F:→ buganini:count($arr)是否等於count(array_unique($arr)) 12/10 21:03
3F:→ buganini:其实也蛮快的 12/10 21:03
4F:→ buganini:array_unique只稍微顿了一下 12/10 21:04
5F:→ buganini:大概因为分岔的很快吧... 12/10 21:05
6F:→ pakker:这样会吃不少记忆体... 12/10 22:40
7F:推 buganini:没错 我第一次跑的时候爆了一次 还要去改php.ini XD 12/10 22:49