73

I want to generate time-based universally unique identifier (UUID) in Java.

The method java.util.UUID.randomUUID() generates a UUID Version 4 where 122 of the 128 bits are from a cryptographically-strong random number generator.

How to generate a Version 1 (time based) UUID ? Is there a separate library for that or is it some how provided in the Java 7 API and I am missing it.

4

8 回答 8

13

FasterXML Java Uuid 生成器 (JUG)

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

UUID uuid = Generators.timeBasedGenerator().generate();
于 2018-02-12T12:13:20.457 回答
12
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

于 2017-03-30T05:55:05.280 回答
10

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

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

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

于 2014-08-05T05:15:48.853 回答
8

UUID 创建者

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

UUID uuid = UuidCreator.getTimeBased();

版本 6时序UUID

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

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

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

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

UUID uuid = UuidCreator.getTimeOrdered();
于 2019-09-23T06:53:33.033 回答
7

版本 1 代表空间时间的一个点

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

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

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

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的问题。

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

于 2020-06-28T22:42:20.073 回答
2

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

我们以以下方式生成 -

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());
于 2019-06-21T06:51:03.603 回答
1

要在 maven 项目中生成基于时间的 UUID,您必须添加生成器的依赖项,即生成基于时间的 UUID。

    <dependency>
        <groupId>com.fasterxml.uuid</groupId>
        <artifactId>java-uuid-generator</artifactId>
        <version>3.1.4</version>
    </dependency>

如果你有一个普通的 java 项目,你必须导入 Generator java-uuid-generator 的库。

然后生成 UUID:

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

现在,如果您想查看 UUID 时间和日期,请在此处查看

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

于 2020-02-20T10:41:00.237 回答
1

Cassandra 的实现或在Github中类型 1 UUID:用法请注意,由于已知错误 ,您不会比较这些 uuid,例如 uuid1>uuid2 等

于 2018-09-20T07:05:57.933 回答