Re: [請益] 產生驗證碼

看板PHP作者 (找尋蔚藍天空)時間18年前 (2007/12/10 19:43), 編輯推噓2(205)
留言7則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《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

12/10 21:02, , 1F
我之前檢查是把每一筆塞進array 最後再檢查
12/10 21:02, 1F

12/10 21:03, , 2F
count($arr)是否等於count(array_unique($arr))
12/10 21:03, 2F

12/10 21:03, , 3F
其實也蠻快的
12/10 21:03, 3F

12/10 21:04, , 4F
array_unique只稍微頓了一下
12/10 21:04, 4F

12/10 21:05, , 5F
大概因為分岔的很快吧...
12/10 21:05, 5F

12/10 22:40, , 6F
這樣會吃不少記憶體...
12/10 22:40, 6F

12/10 22:49, , 7F
沒錯 我第一次跑的時候爆了一次 還要去改php.ini XD
12/10 22:49, 7F
文章代碼(AID): #17NIPg_p (PHP)
討論串 (同標題文章)
文章代碼(AID): #17NIPg_p (PHP)