结合版本 1 和版本 4 UUID 的想法是个好主意吗?

Is it a good idea to combine the ideas of version 1 and version 4 UUIDs?

我想生成基于时间的 UUID,但我不希望 UUID 值的任何部分基于生成它们的机器。

版本 1 UUID 是基于时间的(前 64 位代表时间,后 64 位代表生成它们的机器的 MAC 地址)。

版本 4 UUID 不是基于时间的,而是从随机数生成的。

在我的例子中,我希望能够在同一台机器上为同一时间戳生成多个基于时间的 UUID - 我希望这些 UUID 是唯一的。 UUID 必须仍然是基于时间的,因此按字典顺序对它们进行排序会给出与用于创建它们的时间戳一致的顺序。

有什么好的理由不使用我自己的方案生成 UUID - 前 64 位代表时间戳(如版本 1),后 64 位将随机生成(如版本 4)?

如果 space 不是问题,您可以将 UUID 的 multithreaded/multi-machine 抗碰撞性与时间戳的词法排序结合起来:

System.currentTimeMillis() + "-" + UUID.randomUUID()

ULIDs 非常符合您的要求。您可能需要生成它们 application-side,因为看起来似乎缺少本机数据库支持,但它是 128 位 UUID 的 drop-in,因此您只需将其编码为十六进制即可插入任何 UUID 类型的列。