作者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
推 buganini:我之前檢查是把每一筆塞進array 最後再檢查 12/10 21:02
→ buganini:count($arr)是否等於count(array_unique($arr)) 12/10 21:03
→ buganini:其實也蠻快的 12/10 21:03
→ buganini:array_unique只稍微頓了一下 12/10 21:04
→ buganini:大概因為分岔的很快吧... 12/10 21:05
→ pakker:這樣會吃不少記憶體... 12/10 22:40
推 buganini:沒錯 我第一次跑的時候爆了一次 還要去改php.ini XD 12/10 22:49