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 的稳定性进行选择。