欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談UUID生成的原理及優(yōu)缺點

 更新時間:2023年06月09日 11:33:37   作者:蜀山劍客李沐白  
UUID是一套用于生成全局唯一標(biāo)識符的標(biāo)準(zhǔn),也被稱為GUID?(Globally?Unique?Identifier),通過使用UUID可以在分布式系統(tǒng)中生成唯一的?ID,UUID的生成方式有多種,本文將詳細(xì)講解?UUID?的生成原理、特性、實用場景以及優(yōu)缺點

一、UUID 的生成原理

UUID 的英文全稱為 Universally Unique Identifier,即通用唯一識別碼,它是由一組 16 個字節(jié)(128 位)組成的標(biāo)識符,可以用于唯一地標(biāo)識信息。UUID 的生成方式有多種,其中最為常用的是基于算法的 UUID 生成方式和基于硬件的 UUID 生成方式。下面我們分別來介紹這兩種生成方式的原理。

1. 基于算法的 UUID 生成方式

基于算法的 UUID 生成方式是指使用計算機程序根據(jù)一定的算法生成 UUID。這種方式的優(yōu)點是可以在任何環(huán)境中生成 UUID,并且不需要依賴于任何硬件設(shè)備,缺點是生成的 UUID 不夠隨機,容易被猜測到,因此不適合用于安全領(lǐng)域。

目前最常用的基于算法的 UUID 生成方式是基于時間戳的 UUID 生成方式。該方式基于當(dāng)前時間戳和機器的 MAC 地址生成 UUID,它的算法流程如下:

  • 獲取當(dāng)前時間戳和機器的 MAC 地址;
  • 將當(dāng)前時間戳轉(zhuǎn)換為 UTC 時間,并計算出自 1582 年 10 月 15 日午夜(即格林威治標(biāo)準(zhǔn)時間 0 點)以來的納秒數(shù),將其存儲在 UUID 的時間戳字段中;
  • 將機器的 MAC 地址哈希得到其中的 6 個字節(jié)作為 UUID 的節(jié)點字段;
  • 隨機生成兩個字節(jié)作為 UUID 的時鐘序列字段;
  • 將時間戳、節(jié)點、時鐘序列等信息組合起來,生成 UUID。

基于時間戳的 UUID 生成方式可以保證在同一時刻生成的 UUID 唯一,并且可以提供一定的順序性,因此非常適合用于分布式系統(tǒng)中對數(shù)據(jù)進(jìn)行排序操作。但是,如果多臺計算機的時鐘存在差異,就有可能導(dǎo)致生成重復(fù)的 UUID,因此需要采取一些措施來防止時鐘不同步的問題。此外,這種方式也容易受到時鐘回?fù)芄舻挠绊?,因此需要特殊處理?/p>

2. 基于硬件的 UUID 生成方式

基于硬件的 UUID 生成方式是指使用計算機硬件設(shè)備生成 UUID,該方式的優(yōu)點是生成的 UUID 隨機性高,不容易被猜測到,缺點是只能在具備對應(yīng)硬件設(shè)備的機器上生成 UUID,不夠靈活。

基于硬件的 UUID 生成方式常用的有 MAC 地址 UUID 和 CPU ID UUID。

MAC 地址 UUID 是指使用計算機網(wǎng)卡設(shè)備的 MAC 地址作為 UUID 的節(jié)點字段,這種方式可以保證每個機器生成的 UUID 都是唯一的,并且不依賴于時鐘同步。但是,它也存在一些缺點,比如計算機的網(wǎng)卡可能會被更換,導(dǎo)致 UUID 發(fā)生變化。

CPU ID UUID 是指使用計算機 CPU 的序列號作為 UUID 的節(jié)點字段,這種方式與 MAC 地址 UUID 很相似,但是比 MAC 地址 UUID 更加安全,因為 CPU 序列號不會輕易發(fā)生變化。不過,由于 CPU 可以被替換,因此這種方式也存在一定的風(fēng)險。

二、UUID 的特性

UUID 具有以下幾個特性:

1. 唯一性

UUID 是全局唯一的標(biāo)識符,可以為分布式系統(tǒng)提供唯一的標(biāo)識。

2. 隨機性

UUID 的生成過程使用了隨機性或偽隨機性的元素,生成的 UUID 具有高度隨機性,不容易被猜測到。

3. 不可推測性

UUID 是通過一定的算法生成的,生成的 UUID 不能從中推測出任何信息。

4. 可復(fù)制性

UUID 可以在不同的時間和地點被重復(fù)生成,但是在實踐中,由于隨機數(shù)的使用,重復(fù)的概率非常低。

5. 可比較性

UUID 是一個 128 位的二進(jìn)制數(shù)字,可以進(jìn)行比較操作,比較操作具有一定的順序性。

三、UUID 的實用場景

由于 UUID 具有唯一性、隨機性等特性,因此在很多應(yīng)用場景中都得到了廣泛的應(yīng)用,下面列舉幾個典型的應(yīng)用場景。

1. 數(shù)據(jù)庫主鍵

在數(shù)據(jù)庫中,每個記錄都需要一個唯一的主鍵來區(qū)分,通??梢允褂米栽鲩L ID 作為主鍵。但是在分布式系統(tǒng)中,多個節(jié)點之間可能會產(chǎn)生 ID 沖突的問題。因此,可以使用 UUID 作為主鍵,確保每個記錄的唯一性。

2. 分布式系統(tǒng)

在分布式系統(tǒng)中,需要將數(shù)據(jù)分布存儲在多個節(jié)點上,并對數(shù)據(jù)進(jìn)行全局唯一標(biāo)識。這時可以使用 UUID 來為數(shù)據(jù)生成唯一的 ID,以便在整個系統(tǒng)中進(jìn)行區(qū)分。

3. 日志跟蹤

在分布式系統(tǒng)中,系統(tǒng)運行日志是監(jiān)控和排查問題的重要依據(jù)。如果將日志中的每條記錄都打上唯一的標(biāo)識符,方便后期分析和跟蹤。這時可以使用 UUID 來為日志記錄生成唯一的 ID。

4. 安全領(lǐng)域

在安全領(lǐng)域中,需要為用戶會話、密鑰和證書等生成唯一的標(biāo)識符,以保證安全性。這時可以使用 UUID 來生成唯一的標(biāo)識符,確保不同對象之間的區(qū)分。

四、UUID 的優(yōu)缺點

UUID 具有以下幾個優(yōu)點:

1. 全局唯一

UUID 可以為分布式系統(tǒng)提供全局唯一的標(biāo)識符,避免了 ID 沖突的問題。

2. 可比較性

UUID 是一個數(shù)字,可以進(jìn)行比較操作,具有一定的順序性。

3. 無需中央?yún)f(xié)調(diào)機制

UUID 的生成不需要中央?yún)f(xié)調(diào)機制,因此可以在任何時間和地點生成 UUID。

4. 安全性高

UUID 的生成使用了隨機性或偽隨機性的元素,生成的 UUID 具有高度隨機性,不容易被猜測到。因此可以在安全領(lǐng)域中使用。

但是,UUID 也具有以下幾個缺點:

1. 占用空間大

UUID 是一個 128 位的二進(jìn)制數(shù)字,占用的空間比較大,不適宜作為數(shù)據(jù)庫主鍵使用。

2. 不易讀懂

由于 UUID 是一個數(shù)字,因此不容易被人類讀懂,不便于調(diào)試和排查問題。

3. 不適合順序訪問

UUID 的生成具有隨機性,因此不適合對數(shù)據(jù)進(jìn)行順序訪問操作。

4. 算法復(fù)雜

UUID 的生成算法比較復(fù)雜,在一定程度上影響了性能。

五、代碼示例

import java.util.Random;
public class GenerateUUID {
    private static final long START_EPOCH = -12219292800000L;
    // 定義版本號和變體標(biāo)識的位數(shù)
    private static final int VERSION_BITS = 4;
    private static final int VARIANT_BITS = 2;
    // 生成的 UUID 二進(jìn)制形式共 128 位
    private static final int TOTAL_BITS = 128;
    public static void main(String[] args) {
        Random random = new Random();
        long timestamp = System.currentTimeMillis() + START_EPOCH;
        long leastSigBits = random.nextLong();
        long mostSigBits = random.nextLong();
        // 根據(jù) RFC 4122 規(guī)范設(shè)置 UUID 版本號和變體標(biāo)識
        mostSigBits &= ~(0xfL << 12); // 清空版本號
        mostSigBits |= (4L << 12); // 設(shè)置版本號
        leastSigBits &= ~(0x3L << 62); // 清空變體標(biāo)識
        leastSigBits |= (0x2L << 62); // 設(shè)置變體標(biāo)識
        // 將時間戳寫入 UUID 中段
        long timeLow = timestamp & 0xffffffffL;
        long timeMid = (timestamp >> 32) & 0xffffL;
        long timeHiAndVersion = (timestamp >> 48) & 0x0fffL;
        mostSigBits &= ~(0xffffffffffffL << 64); // 清空時間戳
        mostSigBits |= (timeLow << 32);
        mostSigBits |= (timeMid << 16);
        mostSigBits |= timeHiAndVersion;
        // 構(gòu)造 UUID 對象
        java.util.UUID uuid = new java.util.UUID(mostSigBits, leastSigBits);
        System.out.println(uuid.toString());
    }
}

上述代碼中,我們首先使用 Random 類生成兩個 64 位的偽隨機數(shù),分別作為 UUID 的高 64 位和低 64 位。然后,我們根據(jù) RFC 4122 規(guī)范對 UUID 進(jìn)行版本號標(biāo)記和變體標(biāo)識,并將當(dāng)前時間戳的毫秒部分寫入 UUID 的中段,以保證 UUID 具有一定的順序性。最后,我們將生成的 UUID 的高 64 位和低 64 位傳入 java.util.UUID 類的構(gòu)造方法中,以創(chuàng)建一個 UUID 對象。

需要注意的是,由于我們在生成 UUID 的過程中使用了偽隨機數(shù),因此生成的 UUID 并不是真正的隨機數(shù),它們僅具有偽隨機性。同時,由于我們沒有保證時間戳的唯一性,因此同一時刻生成的 UUID 可能存在重復(fù)的風(fēng)險。在實際應(yīng)用中,我們通常建議使用 java.util.UUID.randomUUID() 方法生成 UUID。

六、總結(jié)

UUID 是一套用于生成全局唯一標(biāo)識符的標(biāo)準(zhǔn),具有唯一性、隨機性等特性,可以在分布式系統(tǒng)中使用。UUID 的生成方式有多種,其中最為常用的是基于算法的 UUID 生成方式和基于硬件的 UUID 生成方式。UUID 在數(shù)據(jù)庫主鍵、分布式系統(tǒng)、日志跟蹤和安全領(lǐng)域等方面有廣泛的應(yīng)用。雖然 UUID 具有很多優(yōu)點,但也存在一些缺點,比如占用空間大、不易讀懂、不適合順序訪問和算法復(fù)雜等。綜合來看,UUID 是一種非常有用的標(biāo)識符生成方式,在實際開發(fā)中應(yīng)根據(jù)具體情況選擇合適的 UUID 生成方式。

以上就是淺談UUID生成的原理及優(yōu)缺點的詳細(xì)內(nèi)容,更多關(guān)于UUID 生成原理及優(yōu)缺點的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 重新理解Java泛型

    重新理解Java泛型

    這篇文章主要介紹了重新理解Java泛型,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java基礎(chǔ)之Web服務(wù)器與Http詳解

    Java基礎(chǔ)之Web服務(wù)器與Http詳解

    無論你是前端開發(fā)者還是后端開發(fā)者,以及測試工程師,這篇文章的知識都是你需要弄懂的。讀完這一篇文章,將全面弄懂 HTTP 協(xié)議、TCP 協(xié)議,面試官再也難不倒你相關(guān)知識
    2021-09-09
  • Mybatis中關(guān)于自定義mapper.xml時,參數(shù)傳遞的方式及寫法

    Mybatis中關(guān)于自定義mapper.xml時,參數(shù)傳遞的方式及寫法

    這篇文章主要介紹了Mybatis中關(guān)于自定義mapper.xml時,參數(shù)傳遞的方式及寫法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Eureka源碼解析服務(wù)離線狀態(tài)變更

    Eureka源碼解析服務(wù)離線狀態(tài)變更

    這篇文章主要為大家介紹了Eureka源碼解析服務(wù)離線的狀態(tài)變更示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 圖解Java經(jīng)典算法冒泡選擇插入希爾排序的原理與實現(xiàn)

    圖解Java經(jīng)典算法冒泡選擇插入希爾排序的原理與實現(xiàn)

    冒泡排序是一種簡單的排序算法,它也是一種穩(wěn)定排序算法。其實現(xiàn)原理是重復(fù)掃描待排序序列,并比較每一對相鄰的元素,當(dāng)該對元素順序不正確時進(jìn)行交換。一直重復(fù)這個過程,直到?jīng)]有任何兩個相鄰元素可以交換,就表明完成了排序
    2022-09-09
  • DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問題

    DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問題

    這篇文章主要介紹了DynamicDataSource怎樣解決多數(shù)據(jù)源的事務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java如何獲取接口所有的實現(xiàn)類

    Java如何獲取接口所有的實現(xiàn)類

    這篇文章主要介紹了Java如何獲取接口所有的實現(xiàn)類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 十個最常見的Java字符串問題(翻譯)

    十個最常見的Java字符串問題(翻譯)

    這篇文章主要介紹了十個最常見的Java字符串問題(翻譯),需要的朋友可以參考下
    2015-03-03
  • 使用java實現(xiàn)手機短信驗證全過程

    使用java實現(xiàn)手機短信驗證全過程

    這篇文章主要介紹了使用java實現(xiàn)手機短信驗證全過程,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java?BigDecimal類用法詳解

    Java?BigDecimal類用法詳解

    本文詳細(xì)講解了Java?BigDecimal類的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評論