1. 程式人生 > >Java生成隨機不反復推廣碼邀請碼

Java生成隨機不反復推廣碼邀請碼

都是 主鍵 line googl popu net 可能 其它 數據

歡迎進入我的博客:blog.scarlettbai.com查看很多其它文章

近期接到一個需求。要批量生成推廣碼,首先我們知道推廣碼的特效有例如以下兩點:

1:不可反復

2:不能夠被猜測出

關於這兩點,我們的思路大體分為例如以下幾類:

1:每次生成一個隨機碼後查數據庫是否有同樣的,有則又一次生成(每次都要訪問數據庫。導致效率極低,不推薦)

2:根據數據庫的主鍵作為唯一鍵,進行打亂或插入操作,如主鍵為8000001,取出後生成3位(據需求增減)隨機數或字母。插入主鍵值中。構成如8000E0V0S1D這樣的串,可保證推廣碼不反復及不可猜測出(這樣的方式也須要連接數據庫取主鍵,當然能夠一次性預生成所需數目的主鍵,然後生成相應推廣碼後更新進數據庫,效率會高一些)

3:利用算法來保證值唯一。如UUID等,本篇重點介紹此種方式(不需連接數據庫,算法選擇合適則效率非常高)

詳細實現

上面說了,本文重點討論利用算法實現不反復性,首先我們會想到最簡單的方式:UUID,我們來看下詳細效果:

技術分享

圖中能夠看出。UUID生成的隨機串去掉-後長度為32位,盡管能夠保證差點兒絕對不會出現反復情況且支持多線程並發也不會反復。可是長度太長,不太有用。

既然UUID被淘汰了,那麽接下來我們來看下我們最常接觸的SHA算法:

技術分享

從圖中能夠看出,SHA算法生成的串也明顯太長,淘汰

接下來我想到了對稱加密算法中的RC4,他能夠保證密文長度和原字符串長度一樣,關於RC4算法本篇不多描寫敘述。大家有興趣能夠上google百度一下,算法網上也有一大堆,大家能夠隨便下一個就好。此處密文選為自增的數字。秘鑰寫死

,接下來我們看一下效果:

技術分享

圖中能夠看出。生成的碼不在字母及數字範圍內,不可能拿這些碼給用戶作為推廣碼,那麽最簡單的一個方式是,將這個碼轉換為16進制,效果例如以下:

技術分享

大家能夠看到,此時密文都成了我們所熟知的字母和數字,可是長度變為了原字符長度的2倍,只是依然算能夠接受,可是看加密後的密文全都是連續性的,不滿足推廣碼第二點的可猜測,並且因為私鑰全都一樣easy被破解,此處我們不需求解密。所以能夠直接把私鑰換成UUID,來看下效果:

技術分享

能夠看到。此處生成的密文不再能夠猜測出,滿足了我們的需求。那麽對於是否會反復。我們再來做個測試。此處選用的需加密字符串長度為7位

技術分享

從圖中能夠看出,字符串長度為7位時,生成了九百多萬個密文。都沒有反復的

,基本能夠滿足絕大部分情況,很多其它的我也沒有進行測試。大家有興趣能夠測試下生成多少位時會出現反復。此種做法的優點是。原字符串長度越長。生成的不會反復的密文量級則會更大,大家能夠按需調節。

只是這樣的方式的唯一不足在於。生成的密文長度是偶數的,假設大家須要確定的奇數長度密文,能夠把RC4加密結果用別的方式轉換為我們經常使用的字母和數字,樓主本處是沒有特殊需求。所以直接採用了轉換16進制這樣的快捷偷懶的方式。


歡迎關註個人微信公眾號:讀書健身編程

技術分享

Java生成隨機不反復推廣碼邀請碼