UUID生成規則詳解

UUID(通用唯一識別碼)是一種被廣泛使用的標識符,用來識別信息系統中的實體。UUID是由一組32位的數字和字母組成,共36個字元,有著極其低的重複概率,被廣泛應用於資料庫主鍵、文件名、消息隊列、分散式系統等方面。接下來,我們將從多個方面對UUID的生成規則進行詳細的闡述:

一、基本結構

UUID的基本結構是32個十六進位字元,通過四個「-」符號進行分割,分成五段。

xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

其中每個「x」代表一個十六進位字元,M、N分別代表兩個十六進位字元。M中的高四位固定為「4」,表示版本號。N中的高四位則有所不同,代表不同的變體。目前常用的是5種變體,分別是

  • 1:基於時間的UUID
  • 2:基於DCE安全的UUID
  • 3:基於名稱的UUID(MD5)
  • 4:隨機生成的UUID
  • 5:基於名稱的UUID(SHA-1)

二、基於時間的UUID的生成規則

基於時間的UUID將時間作為其生成的依據,因此保證了UUID的唯一性。其中的時間是指從格林威治時間(GMT)1970年1月1日00:00:00至今的毫秒數。這種UUID的生成規則如下:

  • 1. 隨機生成一個48位的數,將其作為時間的低48位。
  • 2. 將當前時間轉換成GMT時間,並減去1970年1月1日00:00:00的毫秒數,將得到一個64位的數,該數的高16位和低32位分別組成時間的高16位和中間32位。
  • 3. 將版本號設為「0100」(表示版本4),並將變體設置為「10」(表示基於時間的UUID)。

三、基於DCE安全的UUID的生成規則

DCE(分散式計算環境)是一個基於RPC(遠程過程調用)的分散式計算框架,DCE安全的UUID是在DCE環境下生成的UUID。DCE安全的UUID生成規則如下:

  • 1. 獲取網卡MAC地址。
  • 2. 獲取當前時間,轉換成100納秒為單位的數值。
  • 3. 取得時間的高32位和低32位,從低到高每個16位分別設置版本號、時間戳、MAC地址的標誌位。
  • 4. 將變體設置為「10」(表示基於DCE安全的UUID)。

四、基於名稱的UUID(MD5)的生成規則

基於名稱的UUID是根據一個命名空間和名稱生成的,其中命名空間可以是URI、URL、OID等等,名稱可以是一個字元串、一個URL等等。MD5是一種哈希函數,其生成結果是一個128位的二進位數,通過十六進位表示則為32個字元。基於名稱的UUID(MD5)生成規則如下:

  • 1. 根據命名空間和名稱生成32位的字元串。
  • 2. 對該字元串進行MD5哈希,得到一個128位的二進位數。
  • 3. 將該數轉換為32個字元的十六進位字元串,將其中的某些字元替換為「-」符號以符合UUID的格式。
  • 4. 將版本號設為「0101」(表示版本5),並將變體設置為「10」(表示基於名稱的UUID)。

五、隨機生成的UUID的生成規則

隨機生成的UUID的生成規則如下:

  • 1. 隨機生成一個128位的二進位數。
  • 2. 將該數轉換為32個字元的十六進位字元串,將其中的某些字元替換為「-」符號以符合UUID的格式。
  • 3. 將版本號設為「0100」(表示版本4),並將變體設置為「11」(表示隨機生成的UUID)。

完整的Java代碼示例

import java.util.UUID;

public class TestUUID {

    public static void main(String[] args) {

        // 基於時間的UUID
        UUID uuid1 = UUID.randomUUID();
        System.out.println(uuid1);

        // 基於DCE安全的UUID
        UUID uuid2 = UUID.nameUUIDFromBytes("test".getBytes());
        System.out.println(uuid2);

        // 基於名稱的UUID(MD5)
        UUID uuid3 = UUID.nameUUIDFromBytes("test".getBytes());
        System.out.println(uuid3);

        // 隨機生成的UUID
        UUID uuid4 = UUID.randomUUID();
        System.out.println(uuid4);

    }

}

結語

以上就是UUID生成規則的詳細闡述,從基本結構到各種變體的生成規則,希望對大家有所幫助。在實際應用中,我們可以根據不同的需求選擇不同的變體來生成UUID。

原創文章,作者:CYZJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144223.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CYZJ的頭像CYZJ
上一篇 2024-10-24 15:28
下一篇 2024-10-24 15:28

相關推薦

  • 解析URI編碼規則

    URI(統一資源標識符)是用來標識互聯網上資源的字元串文本標識符,是訪問互聯網資源的地址。在將URI傳送到伺服器或瀏覽器時,需要進行特定編碼處理,這個編碼方式就是URI編碼規則。 …

    編程 2025-04-28
  • Python編寫規則用法介紹

    Python作為一種廣泛使用的高級編程語言,其編寫規則的規範性對於提高代碼可讀性、美觀度以及方便調試、維護至關重要。本文將從命名規則、注釋規則、代碼縮進等多個方面進行詳細的闡述,希…

    編程 2025-04-28
  • Python縮進規則用法介紹

    本文將從多個方面對Python的縮進規則進行詳細的闡述。 一、規則解答 Python中縮進是語法的一部分,它決定了程序的結構和邏輯。Python縮進規則要求同一層級的代碼必須保持相…

    編程 2025-04-28
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25

發表回復

登錄後才能評論