如何生成基于时间的UUID?

dog*_*ish 57 java

我想在java中生成基于时间的UUID - java.util.UUID.randomUUID()生成UUID版本4.如何生成版本1(基于时间)的UUID?是否有一个单独的库,或者它是Java 7 API中提供的一些,我错过了它.

fin*_*eep 10

使用com.eaio.uuid.UUID要非常小心,如果需要按当前时间以外的时间生成GUID,因为这将始终在给定时间内生成相同的UUID.因此,如果您的数据需要生成UUID,其中记录可能具有相同的时间,则会生成相同的UUID.

我们需要这个来为前面创建的记录生成UUID,同时也创建多个记录,我们试图通过尝试使用UUIDGen.createTime()来调整它.我们发现它有一个副作用来改变记录乱序的时间.如果后续创建请求的UUID时间戳早于先前请求,则最终会得到一个UUID基于先前请求的时间戳的a.

在完成所有分析之后,我们必须在创建UUID时简单地返回创建,这样我们就不必将其作为参数传递.无论我们UUID在以后生成哪种解决方案,每个解决方案都有一个缺点.


小智 10

String timeuuid = com.datastax.driver.core.utils.UUIDs.timeBased().toString();
Run Code Online (Sandbox Code Playgroud)

看看 https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/utils/UUIDs.html


fab*_*ace 9

UUID 创建器

这是使用开源项目UUID Creator生成基于时间的 UUID 的另一种方法:

UUID uuid = UuidCreator.getTimeBased();
Run Code Online (Sandbox Code Playgroud)

版本 6按时间排序的UUID

该库还可以生成按时间排序的 UUID,即 UUID v6。

UUID v6、v7 和 v8 是RFC 4122建议补充内容该草案正在GitHub 存储库中进行讨论。

请参阅此处此处的文章以了解新 UUID 的原因。

v6 的实现可以在同一个UUID Creator库中找到。看这个例子:

UUID uuid = UuidCreator.getTimeOrdered();
Run Code Online (Sandbox Code Playgroud)

免责声明:我是 的主要贡献者uuid-creator

  • 这个版本 6 的提案对于在数据库中使用以实现更好的索引非常有价值。感谢您告知这一点。 (4认同)
  • 快速阅读一下,这个版本 6 似乎与[我在实用程序库中实现的重新排序逻辑](https://github.com/chrylis/time-based-uuid-reordering/blob/master/src/main /java/com/chrylis/lib/time_based_uuid_reordering/TimeBasedUuidReordering.java#L35-L45); 你可否确认? (2认同)

Vad*_*zim 6

FasterXML Java Uuid生成器(JUG)

https://github.com/cowtowncoder/java-uuid-generator

UUID uuid = Generators.timeBasedGenerator().generate();
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

版本 1 表示空间时间中的一个点

版本 1 UUID 实际上代表空间时间中的一个点。

“空格”部分是从计算机的网络端口获取的MAC 地址,用于唯一标识 id 的生成位置(几乎是唯一的,网络硬件制造商在分配 MAC 地址时出现了一些臭名昭著的错误)。

“时间”部分是一个 60 位时间戳,它是自1582 年 10 月 15 日午夜以来的 100纳秒间隔数,协调世界时 (UTC)

Java 省略了版本 1

正如您所注意到的,Java 规范不需要版本 1 UUID 的实现。

大概这是因为可能泄露您的 MAC 地址和创建时刻的安全和隐私问题。

第三方实现

正如在其他答案中所见,有可用的第 1 版 UUID 的第 3 方实现。

在 Stack Overflow 上寻求图书馆推荐是题外话。所以我在姊妹网站Software Recommendations Stack Exchange上询问了问题Library to generate Version 1 UUIDs to be called from Java

这里是这里和其他地方的其他答案中提到的实现的精简列表,这些实现似乎仍然受到积极支持。