关于Java:如何生成基于时间的UUID?

How to generate time based UUIDs?

我想在Java中生成基于时间的通用唯一标识符(UUID)。

方法java.util.UUID.randomUUID()生成UUID版本4,其中128位中的122位来自加密强度高的随机数生成器。

如何生成版本1(基于时间)的UUID?是否有一个单独的库,或者它是Java 7 API中提供的某些库,我却不见了。


1
String timeuuid = com.datastax.driver.core.utils.UUIDs.timeBased().toString();

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


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

我们需要它为预先创建的记录以及同时创建多个记录的记录生成UUID,我们尝试通过尝试使用UUIDGen.createTime()来对其进行调整。我们发现改变记录时间会产生副作用。如果后续创建UUID的请求的时间戳早于上一个请求,则您最终会得到一个UUID,它基于前一个请求的时间戳。

所有分析之后,我们只需要在创建时返回创建UUID,这样就不必将其作为参数传递。无论我们想出哪种解决方案在以后生成UUID,每个解决方案都有其缺点。


FasterXML Java Uuid生成器(JUG)

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

1
UUID uuid = Generators.timeBasedGenerator().generate();


UUID Creator库

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

1
UUID uuid = UuidCreator.getTimeBased();

版本6定时UUID

此库还可以生成按时间顺序排列的UUID,也称为UUIDv6。版本6是对RFC 4122的提议的补充。请参见此处和此处的文章。

参见此示例:

1
UUID uuid = UuidCreator.getTimeOrdered();

可以在同一UUID Creator库中找到版本6的实现。


要测试我们的应用程序,我们必须使用com.eaio.uuid.UUID生成具有基于时间的UUID的数据,我们生成了旧的时间戳UUID,因此能够根据我们的测试用例来控制时间戳。
注意:-我们无法生成将来的时间戳UUID

我们通过以下方式生成-

1
2
3
4
5
import com.eaio.uuid.UUID;
import com.eaio.uuid.UUIDGen;

    long time = DateUtil.getEpochtimeFromDate("21-06-2018 12:30:31","dd-M-yyy hh:hh:ss");
    UUID time_based_uuid = new UUID(UUIDGen.createTime(time), UUIDGen.getClockSeqAndNode());

版本1代表时间和空间

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

"空格"部分是从计算机的网络端口获取的MAC地址,用于唯一标识生成ID的位置(几乎是唯一的,网络硬件制造商分配MAC地址时有些臭名昭著) 。

"时间"部分是一个60位的时间戳,它是自1582年10月15日午夜以来的100纳秒间隔的数量。

Java省略了版本1

您已经注意到,Java规范不需要实现版本1 UUID。

大概这是由于可能泄露您的MAC地址和创建时刻而引起的安全和隐私问题。

第三方实施

从其他答案中可以看出,存在第1版UUID的第三方实现。

在库溢出中,关于库建议的要求不在这里。因此,我在姊妹站点Software Recommendations Stack Exchange上问了问题库,以生成要从Java调用的版本1 UUID。

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

  • 提供版本1、2、3、4、5和6的UUID Creator。
  • Java Uuid Generator(JUG)由Tatu Saloranta最初提供。
  • UUIDGen类源代码,是Apache Cassandra项目的一部分。此源代码是根据Apache 2许可发布的。

要在Maven项目中生成基于时间的UUID,您需要添加Generator的依赖项,即生成基于时间的UUID。

1
2
3
4
5
    <dependency>
        <groupId>com.fasterxml.uuid</groupId>
        java-uuid-generator</artifactId>
        <version>3.1.4</version>
    </dependency>

如果您有普通的Java项目,则必须导入Generator的库
java-uuid-generator。

然后生成UUID:

1
UUID uuid= Generators.timeBasedGenerator().generate();

现在,如果要检查UUID时间和日期,请在此处检查。

输入生成的UUID和您当前的时区。


Cassandra的实现或在1型UUID的Github中:用法
请注意,由于已知的错误

,您不对uuid1> uuid2等这些uuid进行比较