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