您好,登錄后才能下訂單哦!
java如何生成唯一字符串ID?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
public static synchronized String gen() { StringBuilder builder = new StringBuilder(System.nanoTime() / 1000 + ""); if (SEQ.incrementAndGet() % 10 == 0) { SEQ.incrementAndGet(); } builder.append(FORMAT.format(SEQ.get())); if ((MAX_PAD_SIZE - 1) == SEQ.get()) { SEQ.set(1); } long v = Long.parseLong(builder.reverse().toString()); return Base62.encode(v); }
這里用千分之一納秒做基數(經測試,基數在10w分之一納秒內都是安全的),再加上1~99的順序號來生成唯一ID。最終可以保證在大于10納秒(近似)的時間區間內不會產生重復值。
為了縮減長度,對字符串做了 Base62處理。在處理前又將納秒數值做了一次翻轉處理。不難想象,如果直接使用原始值來做Base62處理,因為時鐘的特征,最終生成的值的前幾位都是相同的。
來看一下這個程序生成的ID:
aSPog4cC
d4t1xZdt
g2tkZVqv
jrinwXx5
m8ZIAKVr
oUB5nzS5
rZa1gPAl
uD12VZ3A
8dnItkTj
八位的長度,唯一且整齊。下面是一個單元測試:
@Test public void gen() { int size = 10240; Set<String> set = new HashSet<>(); for (int i = 0; i < size; i++) { String code = ShortCode.gen(); //System.out.println(code); set.add(code); } Assert.assertEquals(size, set.size()); }
這里只對10240的規模做了測試。因為唯一ID是基于時鐘生成的,所以測試時整體規模的大小不影響ID的唯一性(和短鏈接方案不一樣)。但是太小了也不行——順序號會發揮作用。10240算是一個中庸的值,足夠暴露問題,也不會有太多的冗余。
仍然需要強調一下:這個方案只能保證在(當前)單機上的唯一性,如果是集群范圍內建議采用其他方案,或者加上一兩位機器ID。
關于java如何生成唯一字符串ID問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。