速看!今天我才知道UUID還分五個版本
通用唯一識別碼(英語:Universally Unique Identifier,縮寫:UUID)是用于計算機體系中以識別信息數(shù)目的一個128位標識符,還有相關(guān)的術(shù)語:全局唯一標識符(GUID)。
根據(jù)標準方法生成,不依賴中央機構(gòu)的注冊和分配,UUID具有唯一性,這與其他大多數(shù)編號方案不同。重復UUID碼概率接近零,可以忽略不計。
UUID是由一組32位數(shù)的16進制數(shù)字所構(gòu)成,故UUID理論上的總數(shù)為16^32=2^128,約等于3.4 x 10^38。也就是說若每納秒(ns)產(chǎn)生1萬億個UUID,要花100億年才會將所有UUID用完。
UUID的標準型式包含32個16進制數(shù)字,以連字號分為五段,形式為 8-4-4-4-12 的32個字符。
- 示例:550e8400-e29b-41d4-a716-446655440000
UUID 格式:
在其規(guī)范的文本表示中,UUID 的 16 個 8 位字節(jié)表示為 32 個十六進制(基數(shù)16)數(shù)字,顯示在由連字符分隔 '-' 的五個組中,"8-4-4-4-12" 總共 36 個字符(32 個字母數(shù)字字符和 4 個連字符)。例如:
- 123e4567-e89b-12d3-a456-426655440000
- xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
ps:上下對比看,a在十六進制中表示10
四位數(shù)字 M表示 UUID 版本,數(shù)字 N的一至三個最高有效位表示 UUID 變體。在例子中,M 是 1 而且 N 是 a(10xx),這意味著此 UUID 是“變體1”、“版本1”UUID;即基于時間的 DCE/RFC 4122 UUID。
UUID 版本:
對于“變體(variants)1”和“變體2”,標準中定義了五個版本(versions),并且在特定用例中每個版本可能比其他版本更合適。
版本由 M 字符串中指示。
版本1 - UUID 是根據(jù)時間和節(jié)點 ID(通常是MAC地址)生成;
版本2 - UUID是根據(jù)標識符(通常是組或用戶ID)、時間和節(jié)點ID生成;
版本3、版本5 - 確定性UUID 通過散列(hashing)名字空間(namespace)標識符和名稱生成;
版本4 - UUID 使用隨機性或偽隨機性生成。
Java中生成 UUID:
下面讓我們介紹一下 Java UUID 類中可以用來生成 UUID 的方法:
1. randomUUID():
它使用加密強度高的偽隨機數(shù)生成器生成v4偽隨機UUID:
- UUID uuid = UUID.randomUUID();
2. nameUUIDFromBytes():
我們可以使用 nameuidfrombytes ()從字節(jié)數(shù)組生成 UUID:
- byte[] byteArr = {11, 23, 33};
- UUID uuid = UUID.nameUUIDFromBytes(byteArr);
此方法生成 v3 UUID (基于名稱的)。
3. fromString():
使用 fromString () ,我們可以從一個標準的字符串表示創(chuàng)建 UUID:
- UUID uuid = UUID.fromString("533a4559-e55c-18b3-2456-555563322002");
對于作為參數(shù)傳入的任何無效字符串,它將拋出 IllegalArgumentException。
比較兩個 uuid:
Java UUID 實現(xiàn)了 Comparable 接口,因此,我們可以使用 compareTo ()方法來比較它們

- UUID uuid1 = UUID.randomUUID();
- UUID uuid2 = UUID.randomUUID();
- int` `result = uuid1.compareTo(uuid2);
如我們所知,compareTo ()方法返回:
- 1: 如果uuid1大于uuid2
- 0:如果uuid1=uuid2
- -1: 如果uuid1小于uuid2
我們也可以選擇使用 equals ()方法進行比較。
總結(jié):
在本教程中,我們了解了 UUID 是什么及其格式和版本。我們還介紹了由 java UUID類中生成uuid的方法。