生成唯一隨機碼的方法及優缺點分析


現在的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);

我把補位與建碼分成了兩個函數進行封裝,看起來有點兒亂,大神些有什么見解歡迎指點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM