現在的WEB中經常會需要產生一些邀請碼、激活碼。需要是唯一並且隨機的。下面總結一些常用的產生隨機碼的方法
從網絡上采集了一些思路,做一下分析。
1. 自己寫代碼產生隨機的數字和字母組合,每產生1個去數據庫查詢該隨機碼是否已存在,如果已存在,則重新產生,直到不重復為止。
優點:沒發現有啥優點。
缺點:產生速度慢,數據庫交互頻繁。
2. guid,該方法應該是用的比較多的。
優點:使用簡單方便,不用自己編寫額外的代碼
缺點:占用數據庫空間相對較大,特別是根據guid查詢速度比較慢(畢竟是字符串)。
3. 主鍵+隨機碼的方式,我們產生的隨機碼保存到數據庫肯定會有個主鍵,用該主鍵+隨機字符來組合。產生步驟:
1) 先從id生成器中獲取id,比如是155.
2)填充成固定位數(比如8位)的字符串(不夠位數的左邊填0,超過位數直接使用該數字),得到:00000155
3)在每個數字后面隨機插入1個字母或其它非數字符號,得到:0A0F0R0Y0H1K5L5M
這樣就可以得到1個隨機的唯一的邀請碼了。
優點:使用也比較簡單,不用查詢數據庫。最大的優點是查詢的時候,可以根據邀請碼直接得到主鍵id,
然后根據id去數據庫查詢(速度很快),再比較查詢出來的邀請碼和用戶提交的邀請碼是否一致。
缺點:需要使用id產生器,如果主鍵是數據庫自增長的就不太好用(需要先進入數據庫獲取id,再更新邀請碼)。
4. 有時候產品經理說,我要求邀請碼都是數字的。why?no why? 我喜歡。
1) 獲取id: 155
2) 轉換成8進制:233
3) 轉為字符串,並在后面加'9'字符:2339
4)在后面隨機產生若干個隨機數字字符:233967524987
轉為8進制后就不會出現9這個字符,然后在后面加個'9',這樣就能確定唯一性。最后在后面產生一些隨機數字就可以。
優缺點同方法3
5.根據各路神仙的方法,構造一個看起來更像隨機碼的偽隨機碼
1)隨機一個數字+字母組合的隨機碼:U5Z1SG
2)獲取id:155
3)轉換成字符串,補齊長度到6位,補齊的字符使用非數字字符,可已在前方或者后方補齊(我這里是補在后面):155XSF
4)把兩個字符串連接在一起:U5Z1SG155XSF
這個字符串是不是更想一個隨機碼了?
優缺點與方法3同理
來看看方法5的實現方法(以PHP為例)
/* 補位函數,使用方法:DispRepair('getstr',repaircode_length,'fillstr','type') 功能:補齊字符串長度 $gstr:原字符串 $newlen:新字符串長度 $fill:補位字符集,不能出現唯一標識中可能出現的字符 type:類型,1為前補,其他值為后補 */ function DispRepair($gstr,$disrepairlen,$fillstr,$type) { $length = $disrepairlen - strlen($gstr);//需要補齊的字符串長度 if($length<1){ return $gstr; }else{ $newstr = "";//創建新字符串
//要補齊的字符串,每一位都隨機一次 for ( $i=0; $i < $length; $i++ ){ $newstr .= $fillstr[mt_rand(0,strlen($fillstr)-1)];//組裝新字符串 } if ($type == 1) { $gstr = $newstr.$gstr;//將新字符串填充到原字符串前方 } else { $gstr .= $newstr;//將新字符串填充到原字符串后方 } } return $gstr; } /* *建碼函數,使用方法:CreateCoupon ("id",code_length,repaircode_length)
*功能:生成帶唯一標識的偽隨機碼
*$newid:int 唯一標識符
*$newcodelen:int 第一段碼值長度
*$newdisrepairlen:int 第二段碼值長度 */ function CreateCoupon ($newid,$newcodelen,$newdisrepairlen){ $codelen = $newcodelen; $id = $newid; $disrepairlen = $newdisrepairlen;
$charset0 = 'ABCDEFGHKMNPRSTUVWXYZ23456789';//第一段隨機碼字符集,數字1,0與字母I,l,O過於形似,字符集中排除了這些字符 $charset = 'ABCDEFGHKMNPRSTUVWXYZ';//補齊碼值的字符集,ID為10進制,字符集中不能出現數字[0-9],否則最終的字符串可能出現重復(盡管前半段與后半段同時重復的概率很低) $_len = strlen($charset0)-1;//字符集最大序號 $coupon = "";//創建隨機碼變量 //創建一個隨機碼,每一位都隨機一次 for ($i=0;$i<$codelen;$i++) { $coupon .= $charset0[mt_rand(0,$_len)]; } $nid = DispRepair($id,$newdisrepairlen,$charset,"0");//調用補位函數補齊特征字符串,防止券碼出現重復,非1為后補 $coupon .= $nid;//組裝成完整的隨機碼 return $coupon; }
CreateCoupon("155",6,6);
我把補位與建碼分成了兩個函數進行封裝,看起來有點兒亂,大神些有什么見解歡迎指點