7

RFC 4122(通用唯一标识符 (UUID) URN 命名空间)使用术语“时钟序列”:

4.1.5。时钟序列

对于 UUID 版本 1,时钟序列用于帮助避免在时钟向后设置或节点 ID 更改时可能出现的重复。

如果时钟向后设置,或者可能已经向后设置(例如,系统关闭时),并且 UUID 生成器无法确定没有生成时间戳大于时钟设置值的 UUID,然后必须更改时钟序列。如果时钟序列的前一个值是已知的,就可以递增;否则应设置为随机或高质量的伪随机值。

类似地,如果节点 ID 发生变化(例如,因为在机器之间移动了网卡),将时钟序列设置为随机数可以最大限度地减少由于机器时钟设置的细微差异而导致重复的概率。如果与更改的节点 ID 相关联的时钟序列的值已知,则时钟序列可以只增加,但这不太可能。

时钟序列必须最初(即,在系统的生命周期中一次)初始化为随机数,以最小化跨系统的相关性。这为节点标识符提供了最大程度的保护,这些节点标识符可能会在系统之间快速移动或切换。初始值不得与节点标识符相关。

对于 UUID 版本 3 或 5,时钟序列是一个 14 位值,由 4.3 节中描述的名称构成。

对于 UUID 版本 4,时钟序列是随机或伪随机生成的 14 位值,如第 4.4 节所述。

这个词是什么意思?

4

4 回答 4

7

“时钟序列”似乎是一个真正具有误导性的名称。根据其定义,更好的名称可能是“uuid 的随机组件”。

uuid 声名鹊起的一大原因是,如果我们都生成一个 UUID 值,我们可以非常确信我们不会生成相同的 128 位值。这说明了可能发生碰撞的情况。

如果我们有一个共同的协调员或预先商定的计划,我们也可以确信我们不会遇到冲突。

潜在方案:

1. Partition Int Space: I get numbers 1-999, you get 1000-1999.
2. Request Reservation: Request 10 numbers and increment a centrally stored max reserved numbers.  You get numbers 1-10.  The next reservation gets 11-20.

大的 UUID 观察是,如果您有很多位(在本例中为 16 个),那么下一个请求者不太可能获得相同的随机值。

彩票就是基于这个概念。

于 2017-01-05T01:44:21.580 回答
1

术语“时钟序列”是用词不当。它只是一个随机数,而不是一个序列。

时钟序列的存在仅用于一个目的:帮助避免重复

RFC-4122 规定在以下情况下必须更改时钟序列:

  • 时钟倒转;
  • 时钟可能已调回;
  • 生成器不确定时钟是否向后;
  • 节点标识符已更改;
  • 节点标识符混淆了。

时钟序列“可以增加”(就像一个序列)。但这是一个可能,而不是一个应该。我发现了一些总是随机化时钟序列herehere的实现。

我认为“序列”这个词会引起混淆。虽然时钟序列在递增时表现得像一个序列,但它实际上是一个随机数。

UUID v1 有 3 个部分,即:

  • 时间(自 1582 年 10 月 15 日以来 100 纳米的数量);
  • 地点(IEEE 地址);
  • 一些熵(时钟序列)。

在这个 Github 问题中,您可以找到关于时钟序列的讨论:https ://github.com/uuid6/uuid6-ietf-draft/issues/41

于 2021-11-10T12:28:45.100 回答
0

https://pubs.opengroup.org/onlinepubs/9629399/apdxa.htm#tagcjh_20_02_01讲述了如何生成时钟序列的算法。

总之,它是在程序开始时生成的随机数。每次都会增加

  • 它检测到本地 UTC 时间倒退
  • 由于应用程序重新启动,未设置上一个 UTC 时间
于 2021-11-09T17:11:43.797 回答
-1

它是构成 UUID 的字段之一,如第 4.1.2 节中所定义。

于 2017-01-05T01:20:36.310 回答