JUG 是一組用於處理 UUID 的 Java 類別:使用任何標準方法產生 UUID、高效能輸出、排序等。它根據 UUID 規範 (RFC-4122) 產生 UUID(有關更多說明,請參閱維基百科 UUID 頁面)
JUG 最初由 Tatu Saloranta ([email protected]) 於 2002 年編寫,多年來一直在更新。此外,許多其他人也幫助修復了錯誤並實現了新功能:請參閱release-notes/CREDITS
以獲得完整清單。
JUG 根據 Apache License 2.0 授權。
JUG 支援 RFC 4122 中定義的兩個「經典」版本]:
1
:基於時間/地點3
和5
:基於名稱哈希4
:基於隨機數以及新(2022-2024 年)提議的(參見 uuid6 和 RFC-4122 bis)變體:
6
:版本1
的重新排序變體(依字典順序)7
:Unix時間戳記+基於隨機的變體(也具有字典順序) 類型 | 地位 |
---|---|
建構(CI) | |
人工製品 | |
開源軟體贊助 | |
Java文檔 | |
代碼覆蓋率 (5.x) | |
OpenSSF 分數 |
JUG 可以用作命令列工具(透過類別com.fasterxml.uuid.Jug
),或用作可插入元件。
Maven 座標為:
< dependency >
< groupId >com.fasterxml.uuid</ groupId >
< artifactId >java-uuid-generator</ artifactId >
< version >5.1.0</ version >
</ dependency >
搖籃:
implementation ' com.fasterxml.uuid:java-uuid-generator:5.1.0 '
JUG 的唯一依賴項是日誌記錄庫:
log4j
(運行時依賴)slf4j
API:透過呼叫應用程式提供日誌記錄實現從3.2.0
版本開始,JUG 定義了 JDK9+ 相容的module-info.class
,模組名稱為com.fasterxml.uuid
。
如需直接下載,請查看 Project Wiki。
JUG 的最初用例是產生 UUID 值。這是透過先選擇要使用的生成器類型,然後呼叫其generate()
方法來完成的。例如:
UUID uuid = Generators . timeBasedGenerator (). generate (); // Version 1
UUID uuid = Generators . randomBasedGenerator (). generate (); // Version 4
UUID uuid = Generators . nameBasedgenerator (). generate ( "string to hash" ); // Version 5
// With JUG 4.1+: support for https://github.com/uuid6/uuid6-ietf-draft versions 6 and 7:
UUID uuid = Generators . timeBasedReorderedGenerator (). generate (); // Version 6
UUID uuid = Generators . timeBasedEpochGenerator (). generate (); // Version 7
// With JUG 5.0 added variation:
UUID uuid = Generators . timeBasedEpochRandomGenerator (). generate (); // Version 7 with per-call random values
如果您想自訂生成器,您可能也只想保留生成器實例:
TimeBasedGenerator gen = Generators . timeBasedGenerator ( EthernetAddress . fromInterface ());
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
如果您的電腦具有標準 IP 網路設置, Generators.defaultTimeBasedGenerator
(在JUG 4.2 中新增)工廠方法將嘗試確定哪個網路介面對應於所有傳出網路流量的預設路由,並使用它來建立基於時間的產生器。如果您想要版本 1 UUID 產生器,這對於常見使用情境來說可能是個不錯的選擇。
TimeBasedGenerator gen = Generators . defaultTimeBasedGenerator ();
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
生成器是完全線程安全的,因此單一實體可以在多個線程之間共用。
可以從 Project Wiki 找到更多資訊的 Javadoc。
java.util.UUID
值轉換為 byte[]有時您可能想要從java.util.UUID
轉換為外部序列化:例如,轉換為String
或位元組陣列 ( byte[]
)。使用UUID.toString()
(由 JDK 提供)可以輕鬆轉換為String
,但沒有類似的轉換為byte[]
功能。
但UUIDUtil
類別提供了有效轉換的方法:
byte[] asBytes = UUIDUtil.asByteArray(uuid);
// or if you have longer buffer already
byte[] outputBuffer = new byte[1000];
// append at position #100
UUIDUtil.toByteArray(uuid, outputBuffer, 100);
java.util.UUID
值UUID
值通常作為 java String
或byte[]
(位元組數組)傳遞,並且需要轉換才能取得實際的java.util.UUID
實例。 JUG 透過UUIDUtil
類別(套件com.fasterxml.uuid.impl
)提供了最佳化的轉換功能,用法如下:
UUID uuidFromStr = UUIDUtil.uuid("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
byte[] rawUuidBytes = ...; // byte array with 16 bytes
UUID uuidFromBytes = UUIDUtil.uuid(rawUuidBytes)
請注意,雖然 JDK 具有從String
建構UUID
的功能,如下所示:
UUID uuidFromStr = UUID.fromString("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
它比 JUG 版本慢得多:有關更多信息,請閱讀Measurement Performance of Java UUID.fromString()。
JUG jar 在target/
下建構:
target/java-uuid-generator-5.1.0-SNAPSHOT.jar
也可以用作簡單的命令列 UUID 產生工具。
若要查看用法,您可以執行以下操作:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar
並獲得完整的說明,但要產生 5 個基於隨機的 UUID,您可以使用:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar -c 5 r
(其中-c
(或--count
)表示要產生的 UUID 數量, r
表示基於隨機的版本)
注意:此功能從 JUG 4.1 開始包含 - 對於早期版本,您將需要更長的呼叫時間,因為 Jar 元資料未指定「Main-Class」。如果是這樣,您需要使用
java -cp target/java-uuid-generator-5.1.0-SNAPSHOT.jar com.fasterxml.uuid.Jug -c 5 r
JUG 3.1 及更高版本需要 JDK 1.6 才能運作,主要是為了能夠存取本地乙太網路 MAC 位址。早期版本(3.0 及之前)適用於 1.4(引入了java.util.UUID
)。
JUG 版本 5.0 及更高版本需要 JDK 8 才能運作。
JDK 的java.util.UUID
的compareTo()
實作有缺陷,它使用 64 位元值的簡單比較。鑑於底層內容出於所有目的均未簽名,因此這不會按預期工作。例如兩個 UUID:
7f905a0b-bb6e-11e3-9e8f-000000000000
8028f08c-bb6e-11e3-9e8f-000000000000
由於符號擴展,將首先對第二個進行排序(第二個值被認為是負數,因此“較小”)。
因此,您應該始終使用外部比較器,例如com.fasterxml.uuid.UUIDComparator
,它實現了預期的排序順序,即簡單的無符號排序,這也與UUID 的字典(字母)排序相同(假設統一大小寫時) 。
作為 Tidelift 訂閱的一部分提供。
java-uuid-generator
和數千個其他軟體包的維護者正在與 Tidelift 合作,為您用於建立應用程式的開源依賴項提供商業支援和維護。節省時間、降低風險並改善程式碼運作狀況,同時向您使用的確切依賴項的維護者付費。了解更多。
對於簡單的錯誤報告和修復以及功能請求,請僅使用專案問題追蹤器,但我們建議提交 Tidelift 安全聯絡人的安全相關問題除外(注意:您不必成為訂閱者即可執行此操作)。
還有許多其他公開可用的 UUID 產生器。例如:
java.util.UUID
,但省略了生成方法(尤其是基於時間/位置的生成方法),許多操作的性能不達標,並且以無用的方式實現比較請注意,雖然有些軟體包聲稱比其他軟體包更快,但尚不清楚:
因此通常最好根據套件和 API 的穩定性進行選擇。