作者buganini (霸格尼尼)
看板PHP
標題Re: [請益] 產生驗證碼
時間Sat Dec 8 19:31:24 2007
※ 引述《cloudlin322 (麥芽糖N  ﳿ︠)》之銘言:
: 想請問一下板上的高手
: 我現在要寫個程式來產生驗證碼
: 而這驗證碼為7位數 由數字、大小寫英文所產生
: 問題不在於如何產生
: 主要的問題在於我要產生六十萬筆!!!!!!!!!!
: 而且每一筆都要不一樣
: 想要請問怎樣子寫才會快??
: 目前做法:
: 產生的驗證碼去比對資料庫,若是沒有則儲存到資料庫裡面
: 每產生一筆就要去比對一次
: 產生到第四萬筆就要去比對四萬筆資料
: 接下來就會速度很慢了....導致網頁time out....
#!/usr/local/bin/php
<?php
$a=array();
$r='';
$a[$r]=1;
for($i=0;$i<600000;++$i){
while(isset($a[$r])){
$r=gen();
}
echo $i.':'.$r."\n";
$a[$r]=1;
}
function gen(){
$t='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$r='';
for($i=0;$i<7;++$i){
$r.=$t[rand(0,61)];
}
return $r;
}
?>
這樣一下子就跑完了
記憶體能裝的下的東西就裝記憶體
快多了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 221.169.71.109
1F:→ buganini:在我可憐的筆電上跑1分鐘11.46秒 12/08 19:33
2F:→ buganini:而且由於對hash做的最佳化 剛好在這問題上有效果 12/08 19:35
3F:→ buganini:所以isset()又會比塞進array再用in_array快 12/08 19:42
4F:推 cloudlin322:請問這樣能確保每個值都是唯一的嗎?? 12/08 19:44
5F:→ buganini:你說呢 12/08 19:50
6F:→ buganini:如果沒寫錯的話應該是....但我無法確定我有沒有腦殘 12/08 19:50
7F:→ buganini:加上另一道檢查跑了三次都沒出錯 12/08 19:57
8F:→ buganini:把substr($t,rand(0,61),1)改成$t[rand(0,61)] 12/08 20:00
9F:→ buganini:剩下42.34秒 12/08 20:01
※ 編輯: buganini 來自: 221.169.71.109 (12/08 20:01)
10F:→ buganini:直接redirect進檔案應該會更快 12/08 20:03
11F:→ buganini:喔喔 剛剛42.34是因為我把畫面切過來打逼了 12/08 20:04
12F:→ buganini:全程觀看畫面是1:02 全程不觀看畫面15.26秒 12/08 20:05
13F:→ buganini:OS:視窗真是吃資源... 12/08 20:05
14F:推 buganini:在我筆店上redirect進檔案大概45~48秒 12/08 20:16