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

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

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

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

           

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

               優(yōu)點(diǎn):沒(méi)發(fā)現(xiàn)有啥優(yōu)點(diǎn)。     

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

           

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

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

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

           

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

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

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

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

             這樣就可以得到1個(gè)隨機(jī)的唯一的邀請(qǐng)碼了。    

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

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

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

           

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

            1) 獲取id: 155    

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

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

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

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

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

           

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


          PS:以上是個(gè)人淺見(jiàn),有更好方法的同學(xué)請(qǐng)分享下。^_^ 



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

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

          評(píng)論

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          2010-10-20 14:10 by @joe
          你那幾個(gè)按鈕貌似用來(lái)給自己增加點(diǎn)擊率的吧,夠狠啊 兄弟!

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

          2010-10-20 14:19 by BearRui(AK-47)
          @@joe
          哈哈,本來(lái)只是想讓懶人做個(gè)簡(jiǎn)單快捷的評(píng)價(jià),但很多人不知道就狂點(diǎn)了。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          2010-10-22 23:54 by 李小武
          不錯(cuò)啊,一會(huì)實(shí)踐一下

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

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

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

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

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

          2014-09-15 08:48 by lei
          生成:
          1.獲取id(固定長(zhǎng)度)
          2,根據(jù)id用保密的方法生成哈希(根據(jù)需要節(jié)選一定的長(zhǎng)度)
          3,最后把 id+哈希 用不易混淆的字符編碼成序列號(hào)。
          檢驗(yàn):
          1,解碼
          2,用前面的id用同樣的方法生成哈希
          3,檢驗(yàn)
          主站蜘蛛池模板: 彭州市| 收藏| 左云县| 松滋市| 东宁县| 固始县| 正阳县| 乡宁县| 武山县| 江口县| 呼玛县| 长乐市| 商洛市| 周至县| 徐州市| 宿州市| 东宁县| 长乐市| 三明市| 奉贤区| 行唐县| 乌恰县| 锦屏县| 宁津县| 抚顺市| 桃园县| 巴南区| 普宁市| 东港市| 榆林市| 漳浦县| 巴楚县| 寻乌县| 甘肃省| 庆云县| 田阳县| 泾川县| 神池县| 新郑市| 江津市| 曲水县|