亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java唯一字符串ID生成方案詳解

 更新時(shí)間:2020年10月02日 09:28:25   作者:ZY筆記  
這篇文章主要給大家介紹了關(guān)于java唯一字符串ID生成方案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

工作中經(jīng)常會(huì)有生成唯一字符串的需求。通常最容易想到的是UUID。UUID的唯一性毋庸置疑,但是32位的長(zhǎng)度也容易讓人退避三舍。也曾經(jīng)想過(guò)參考《短網(wǎng)址生成方案》來(lái)生成一串ID,但是試驗(yàn)了一下發(fā)現(xiàn)唯一性不太好。

最終采用的方案是時(shí)鐘方案,簡(jiǎn)單來(lái)說(shuō)就是用當(dāng)前時(shí)間戳做唯一ID。

采用時(shí)間戳做ID,秒或毫秒都容易產(chǎn)生重復(fù),換成納秒在單節(jié)點(diǎn)上就沒(méi)問(wèn)題了。參考百度百科關(guān)于納秒的描述就能清楚為什么納秒級(jí)別的時(shí)間戳不會(huì)產(chǎn)生重復(fù):

光在真空中一納秒僅傳播0.3米。個(gè)人電腦的微處理器執(zhí)行一道指令(如將兩數(shù)相加)約需2至4納秒。

我們生成一條唯一ID所需的CPU指令絕不止一道,因此用納秒作單機(jī)唯一ID是綽綽有余的。在測(cè)試中發(fā)現(xiàn),即使是千分之一納秒也足夠我們?cè)赑C機(jī)上生成唯一ID了。

至于長(zhǎng)度:對(duì)原始值做一次Base62處理,長(zhǎng)度就能縮減到令人滿意的程度。

不多廢話,直接上代碼:

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);
}

這里用千分之一納秒做基數(shù)(經(jīng)測(cè)試,基數(shù)在10w分之一納秒內(nèi)都是安全的),再加上1~99的順序號(hào)來(lái)生成唯一ID。最終可以保證在大于10納秒(近似)的時(shí)間區(qū)間內(nèi)不會(huì)產(chǎn)生重復(fù)值。

為了縮減長(zhǎng)度,對(duì)字符串做了 Base62處理。在處理前又將納秒數(shù)值做了一次翻轉(zhuǎn)處理。不難想象,如果直接使用原始值來(lái)做Base62處理,因?yàn)闀r(shí)鐘的特征,最終生成的值的前幾位都是相同的。

來(lái)看一下這個(gè)程序生成的ID:

aSPog4cC
d4t1xZdt
g2tkZVqv
jrinwXx5
m8ZIAKVr
oUB5nzS5
rZa1gPAl
uD12VZ3A
8dnItkTj

八位的長(zhǎng)度,唯一且整齊。下面是一個(gè)單元測(cè)試:

@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());
}

這里只對(duì)10240的規(guī)模做了測(cè)試。因?yàn)槲ㄒ籌D是基于時(shí)鐘生成的,所以測(cè)試時(shí)整體規(guī)模的大小不影響ID的唯一性(和短鏈接方案不一樣)。但是太小了也不行——順序號(hào)會(huì)發(fā)揮作用。10240算是一個(gè)中庸的值,足夠暴露問(wèn)題,也不會(huì)有太多的冗余。

仍然需要強(qiáng)調(diào)一下:這個(gè)方案只能保證在(當(dāng)前)單機(jī)上的唯一性,如果是集群范圍內(nèi)建議采用其他方案,或者加上一兩位機(jī)器ID。

總結(jié)

到此這篇關(guān)于java唯一字符串ID生成方案的文章就介紹到這了,更多相關(guān)java唯一字符串ID生成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java JUnit 使用及常用注解

    Java JUnit 使用及常用注解

    JUnit是Java開(kāi)發(fā)中必不可少的測(cè)試框架之一,它可以幫助您編寫(xiě)高質(zhì)量、可維護(hù)的單元測(cè)試,本文介紹了JUnit的基本用法、常用注解、測(cè)試套件和參數(shù)化測(cè)試等內(nèi)容,希望對(duì)您的測(cè)試工作有所幫助,感興趣的朋友一起看看吧
    2023-12-12
  • JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)方法

    JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)方法

    這篇文章主要給大家介紹了關(guān)于JavaGUI界面實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的相關(guān)資料, GUI是指圖形用戶界面,指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面,需要的朋友可以參考下
    2023-07-07
  • Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼

    Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼

    這篇文章主要介紹了Java中二叉樹(shù)的建立和各種遍歷實(shí)例代碼,涉及樹(shù)節(jié)點(diǎn)的定義,后序遍歷,層序遍歷,深度優(yōu)先和廣度優(yōu)先等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 使用Spring自定義命名空間

    使用Spring自定義命名空間

    這篇文章主要介紹了使用Spring自定義命名空間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java json與map互相轉(zhuǎn)換的示例

    java json與map互相轉(zhuǎn)換的示例

    這篇文章主要介紹了java json與map互相轉(zhuǎn)換的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • Maven 配置文件 生命周期 常用命令詳解

    Maven 配置文件 生命周期 常用命令詳解

    Maven是圍繞著構(gòu)建生命周期的核心概念為原型,整個(gè)項(xiàng)目的創(chuàng)建和部署都是圍繞著生命周期展開(kāi)的,一個(gè)生命周期由若干個(gè)生命周期階段組成。下面通過(guò)本文給大家介紹Maven 配置文件 生命周期 常用命令詳解,一起看看吧
    2017-11-11
  • springmvc使用REST出現(xiàn):Request?method?'PUT'?not?supported問(wèn)題

    springmvc使用REST出現(xiàn):Request?method?'PUT'?not?sup

    這篇文章主要介紹了springmvc使用REST出現(xiàn):Request?method?'PUT'?not?supported問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java解決約瑟夫問(wèn)題代碼實(shí)例

    Java解決約瑟夫問(wèn)題代碼實(shí)例

    這篇文章主要介紹了Java解決約瑟夫(環(huán))問(wèn)題的代碼實(shí)例,決約瑟問(wèn)題貌似經(jīng)常出現(xiàn)在面試題中,需要的朋友可以參考下
    2014-03-03
  • 關(guān)于IDEA報(bào)錯(cuò)Error:java 不支持發(fā)行版本17的原因及解決方案

    關(guān)于IDEA報(bào)錯(cuò)Error:java 不支持發(fā)行版本17的原因及解決方案

    在rebuild或運(yùn)行項(xiàng)目時(shí)提示“Error:java: 錯(cuò)誤: 不支持發(fā)行版本 17”,本文將給大家介紹了IDEA提示“Error:java: 錯(cuò)誤: 不支持發(fā)行版本17”的原因及解決方案,需要的朋友可以參考下
    2023-09-09
  • Spring循環(huán)依賴(lài)實(shí)現(xiàn)過(guò)程揭秘

    Spring循環(huán)依賴(lài)實(shí)現(xiàn)過(guò)程揭秘

    這篇文章主要介紹了Spring循環(huán)依賴(lài)實(shí)現(xiàn)過(guò)程,Spring的解決循環(huán)依賴(lài)是有前置條件的,要解決循環(huán)依賴(lài)我們首先要了解Spring Bean對(duì)象的創(chuàng)建過(guò)程和依賴(lài)注入的方式
    2023-01-01

最新評(píng)論