如何顺序生成UUID以使两个连续的uuid之间的差异为1?

pjs*_*gar 2 java uuid pagination

我正在研究基于游标的分页,并且需要一个连续的唯一列,因此它会给出正确的获取结果。我知道这可以通过将列设置为 datatype bigint 的 auto_increment 来解决,但最终它会达到它的限制,即 9223372036854775807。

所以我想生成一个如下所示的顺序 UUID,其compareTo 结果为 1。

cf3ea0ca-282d-11ec-9624-a71256fa1790

cf3ea0cb-282d-11ec-9624-410ea2fdd62c

cf3ea0cc-282d-11ec-9624-3b1a2da8c7d0

cf3ea0cd-282d-11ec-9624-877d8646d279

我使用https://github.com/cowtowncoder/java-uuid-generator库生成了这些 UUID

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

这就是生成 UUID 的方式,但它并没有给出一致的结果。

还有其他方法可以生成按升序排列的 UUID。

Bas*_*que 7

你问:

\n
\n

如何顺序生成UUID以使两个连续的uuid之间的差异为1?

\n
\n

不可以,您无法生成连续的 UUID 值。

\n

您\xe2\x80\x99ve 误解了通用唯一标识符 (UUID)的目标。

\n

UUID 是无需通过中央机构协调即可生成的标识符。这样就排除了诸如 1, 2, 3, \xe2\x80\xa6 之类的序列。

\n

UUID 旨在 (a) 几乎唯一,并且 (b) 值任意。队列中的下一个 UUID 是不可预测的。

\n

甚至 UUID 中的内容类型也可能会有所不同,已经定义了多个版本的 UUID,并且提出了一些新版本。一个版本代表空间和时间中的一个点,另一个版本几乎完全是随机的,还有一些版本可以使用其他方式生成。但它们都是有效的 UUID,并且可以一起使用。

\n
\n

新版本 6、7 和 8 UUID 的工作正在进行中。在这个尚未完成的规范草案中,UUID 的位被重新排列,以使日期部分按时间顺序排序。这种自然的排序将使数据库中的索引更加有效。

\n

  • UUID v7 使用最高有效 48 位来编码时间戳(毫秒精度),并发布在 [UUID RFC 更新草案](https://datatracker.ietf.org/doc/draft-ietf-uuidrev-rfc4122bis /)。这使得 UUID 可排序。更多详细信息请参见[这篇博文](https://buildkite.com/blog/goodbye-integers-hello-uuids)。 (2认同)