Java生成隨機不重複推廣碼邀請碼

2021-08-08 13:41:44 字數 1437 閱讀 5234

非常感謝

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

1:不可重複

2:不可以被推測出

2:依據資料庫的主鍵作為唯一鍵,進行打亂或插入操作,如主鍵為8000001,取出後生成3位(據需求增減)隨機數或字母,插入主鍵值中,構成如8000e0v0s1d這種串,可保證推廣碼不重複及不可推測出(這種方式也需要連線資料庫取主鍵,當然可以一次性預生成所需數目的主鍵,然後生成對應推廣碼後更新進資料庫,效率會高一些)

3:利用演算法來保證值唯一,如uuid等,本篇重點介紹此種方式(不需連線資料庫,演算法選擇合適則效率很高)

具體實現

上面說了,本文重點討論利用演算法實現不重複性,首先我們會想到最簡單的方式:uuid,我們來看下具體效果:

圖中可以看出,uuid生成的隨機串去掉-後長度為32位,雖然可以保證幾乎絕對不會出現重複情況且支援多執行緒併發也不會重複,但是長度太長,不太實用。

既然uuid被淘汰了,那麼接下來我們來看下我們最常接觸的sha演算法:

從圖中可以看出,sha演算法生成的串也明顯太長,淘汰。

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

大家可以看到,此時密文都成了我們所熟知的字母和數字,但是長度變為了原字元長度的2倍,不過依舊算可以接受,但是看加密後的密文全都是連續性的,不滿足推廣碼第二點的可推測,而且由於私鑰全都一樣容易被破解,此處我們不需求解密,所以可以直接把私鑰換成uuid,來看下效果:

可以看到,此處生成的密文不再可以推測出,滿足了我們的需求,那麼對於是否會重複,我們再來做個測試,此處選用的需加密字串長度為7位:

從圖中可以看出,字串長度為7位時,生成了九百多萬個密文,都沒有重複的,基本可以滿足絕大部分情況,更多的我也沒有進行測試,大家有興趣可以測試下生成多少位時會出現重複。此種做法的好處是,原字串長度越長,生成的不會重複的密文量級則會更大,大家可以按需調節。

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

Java生成8位隨機邀請碼,不重複

public static string chars new string public static string generateshortuuid return shortbuffer.tostring 短8位uuid思想其實借鑑微博短網域名稱的生成方式,但是其重複概率過高,而且每次生成4個,...

Java 不重複隨機數生成簡易演算法

通過單個陣列簡易實現不重複隨機數生成,先上原始碼。獲取隨機數組 param 源陣列 param size 目標陣列大小 return 隨機數組 public static int getrandomres int source,int size int result new int size ran...

隨機生成不重複的資料

1 js生成不重複的隨機數 方法一 傳入乙個最大允許生成的引數。隨機生成十個不重複的資料出來 param是生成的最大數 function getnewrandomstr param if isequ i else num num.length val for var j 0 j num.length...