posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          產(chǎn)生唯一隨機碼的方法分析。

          Posted on 2010-10-19 11:24 BearRui(AK-47) 閱讀(10491) 評論(22)  編輯  收藏 所屬分類: Java

            現(xiàn)在的WEB中經(jīng)常會需要產(chǎn)生一些邀請碼、激活碼。需要是唯一并且隨機的。下面總結(jié)下一些常用的產(chǎn)生隨機碼的方法,并分享自己的1個方法:

           

          1. 自己寫代碼產(chǎn)生隨機的數(shù)字和字母組合,每產(chǎn)生1個去數(shù)據(jù)庫查詢該隨機碼是否已存在,如果已存在,則重新產(chǎn)生,直到不重復(fù)為止。

               優(yōu)點:沒發(fā)現(xiàn)有啥優(yōu)點。     

               缺點:產(chǎn)生速度慢,還要查詢數(shù)據(jù)庫,當(dāng)數(shù)據(jù)量大的時候,可能重復(fù)的機率會比較高,要查詢多次數(shù)據(jù)庫.

           

          2. guid,該方法應(yīng)該是用的比較多的。     

            優(yōu)點:使用簡單方便,不用自己編寫額外的代碼     

            缺點:占用數(shù)據(jù)庫空間相對較大,特別是根據(jù)guid查詢速度比較慢(畢竟是字符串)。

           

          3. 主鍵+隨機碼的方式,我們產(chǎn)生的隨機碼保存到數(shù)據(jù)庫肯定會有個主鍵,用該主鍵+隨機字符來組合。產(chǎn)生步驟:     

            1) 先從id生成器中獲取id,比如是155.     

            2)填充成固定位數(shù)(比如8位)的字符串(不夠位數(shù)的左邊填0,超過位數(shù)直接使用該數(shù)字),得到:00000155     

            3)在每個數(shù)字后面隨機插入1個字母或其它非數(shù)字符號,得到:0A0F0R0Y0H1K5L5M

             這樣就可以得到1個隨機的唯一的邀請碼了。    

            優(yōu)點:使用也比較簡單,不用查詢數(shù)據(jù)庫。最大的優(yōu)點是查詢的時候,可以根據(jù)邀請碼直接得到主鍵id,     

               然后根據(jù)id去數(shù)據(jù)庫查詢(速度很快),再比較查詢出來的邀請碼和用戶提交的邀請碼是否一致。    

            缺點:需要使用id產(chǎn)生器,如果主鍵是數(shù)據(jù)庫自增長的就不太好用(需要先插入數(shù)據(jù)庫獲取id,再更新邀請碼)。

           

          4. 有時候產(chǎn)品經(jīng)理說,我要求邀請碼都是數(shù)字的。why?no why? 我喜歡。*(&^(^%&^$&^$ 把方法3變通下就可以實現(xiàn)唯一的純數(shù)字隨機碼了。    

            1) 獲取id: 155    

            2) 轉(zhuǎn)換成8進制:233    

            3) 轉(zhuǎn)為字符串,并在后面加'9'字符:2339    

            4)在后面隨機產(chǎn)生若干個隨機數(shù)字字符:2003967524987 

             轉(zhuǎn)為8進制后就不會出現(xiàn)9這個字符,然后在后面加個'9',這樣就能確定唯一性。最后在后面產(chǎn)生一些隨機數(shù)字就可以。

                優(yōu)缺點同方法3

           

          目前方法3,4方法在我們產(chǎn)品中都使用了,感覺還可以。 


          PS:以上是個人淺見,有更好方法的同學(xué)請分享下。^_^ 



          [作者]:BearRui(AK-47)
          [博客]: http://www.aygfsteel.com/bearrui/
          [聲明]:本博所有文章版權(quán)歸作者所有(除特殊說明以外),轉(zhuǎn)載請注明出處.
          英雄,別走啊,幫哥評論下:  

          精彩推薦 好文要頂 水平一般 看不懂 還需努力

          評論

          # re: 產(chǎn)生唯一隨機碼的方法分析。[未登錄]  回復(fù)  更多評論   

          2010-10-19 13:51 by GreatGhoul
          最后一個原理是什么?

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-19 13:53 by BearRui(AK-47)
          @GreatGhoul
          最后1個原理也是使用唯一的KEY+隨機數(shù)字。

          轉(zhuǎn)8進制后在后面加個"9"就能保證這段數(shù)字是唯一的。

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-19 18:22 by huliqing
          文章很精彩,推薦一下!
          納悶:(
          剛才看了您文章下的幾個按鈕,看著不錯,點了幾下,沒有想到變成回復(fù)刷屏了。抱歉哦!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-19 18:47 by @joe
          第四種思想不錯。
          建議根據(jù)使用頻率先在數(shù)據(jù)庫批量生成一定數(shù)量的自增數(shù),供使用,而不是每次都插入新的數(shù)。

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-19 18:48 by BearRui(AK-47)
          @@joe
          預(yù)先插入數(shù)據(jù)的方法也非常不錯,謝謝分享。

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-19 18:49 by BearRui(AK-47)
          @huliqing
          呵呵,沒關(guān)系,^_^

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-20 07:58 by 深藍(lán)色心情
          1和2的方式好像是不行的,經(jīng)過我測試,無論uuid還是guid,同一臺機器,產(chǎn)生的隨機碼都是和時間相關(guān)的。如果短時間產(chǎn)生的串,只有后幾位不一樣,其他都一樣,所以還是比較容易碰出來的。

          一個比較好的隨機串產(chǎn)生方法是創(chuàng)建BigInteger,然后傳入SecureRandom產(chǎn)生隨機的大數(shù)字,再編碼成包含數(shù)字和字母的串,基本上沒有重復(fù)。

          guzz提供了random主鍵生成器,如果您用guzz做持久層,只需要指定id的generator="random"就自動獲取了產(chǎn)生隨機主鍵的支持。通過length參數(shù)選擇隨機主鍵的長度。

          我說方式的實現(xiàn)代碼:http://code.google.com/p/guzz/source/browse/trunk/core/org/guzz/id/RandomIdGenerator.java

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-20 08:56 by BearRui(AK-47)
          @深藍(lán)色心情
          你的方法也不錯,不過你這方法只是理論上的不重復(fù)吧。

          你用這個做主鍵insert前不判斷該key是否已經(jīng)存在嗎?還是在insert出錯后再重新生成?

          # re: 產(chǎn)生唯一隨機碼的方法分析。[未登錄]  回復(fù)  更多評論   

          2010-10-20 09:39 by Carl
          不錯!我的數(shù)據(jù)庫主鍵ID就是采用的4方法。

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-20 14:10 by @joe
          你那幾個按鈕貌似用來給自己增加點擊率的吧,夠狠啊 兄弟!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-20 14:19 by BearRui(AK-47)
          @@joe
          哈哈,本來只是想讓懶人做個簡單快捷的評價,但很多人不知道就狂點了。

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-20 17:11 by 深藍(lán)色心情
          @BearRui(AK-47)

          很難出現(xiàn)重復(fù),如果你用64位長度的key,出現(xiàn)重復(fù)的幾率為36的64次方,幾乎可以忽略。不需要提前驗證key是否存在。

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:47 by 李小武
          看不懂哦,~_~

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:47 by 李小武
          文章很精彩,推薦一下!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:47 by 李小武
          好文章,頂一下!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:47 by 李小武
          文章很精彩,推薦一下!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:53 by 李小武
          好文章,頂一下!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:53 by 李小武
          文章很精彩,推薦一下!

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2010-10-22 23:54 by 李小武
          不錯啊,一會實踐一下

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2012-07-29 17:28 by justintung
          "自己寫代碼產(chǎn)生隨機的數(shù)字和字母組合…… 優(yōu)點:沒發(fā)現(xiàn)有啥優(yōu)點。缺點:產(chǎn)生速度慢,還要查詢數(shù)據(jù)庫,當(dāng)數(shù)據(jù)量大的時候,可能重復(fù)的機率會比較高,要查詢多次數(shù)據(jù)庫." 為什么要查數(shù)據(jù)庫?后面3種方法是機器的自主意識產(chǎn)生的,不用代碼實現(xiàn)?

          # re: 產(chǎn)生唯一隨機碼的方法分析。  回復(fù)  更多評論   

          2014-04-17 16:08 by chieveit
          剛好遇上這個問題,很有幫助,謝謝!

          # re: 產(chǎn)生唯一隨機碼的方法分析。[未登錄]  回復(fù)  更多評論   

          2014-09-15 08:48 by lei
          生成:
          1.獲取id(固定長度)
          2,根據(jù)id用保密的方法生成哈希(根據(jù)需要節(jié)選一定的長度)
          3,最后把 id+哈希 用不易混淆的字符編碼成序列號。
          檢驗:
          1,解碼
          2,用前面的id用同樣的方法生成哈希
          3,檢驗
          主站蜘蛛池模板: 临邑县| 呼玛县| 禹州市| 武川县| 天门市| 衡阳县| 井陉县| 齐齐哈尔市| 仁寿县| 昆明市| 美姑县| 达州市| 九龙县| 遂溪县| 邵阳市| 杭锦后旗| 出国| 库车县| 安庆市| 宽甸| 德州市| 山西省| 揭东县| 乌拉特中旗| 阜平县| 嘉鱼县| 筠连县| 永宁县| 旌德县| 蚌埠市| 崇阳县| 枝江市| 大埔县| 灵台县| 普洱| 江口县| 南充市| 遂宁市| 五莲县| 莆田市| 温泉县|