0

如何实现给定版本 1 TimeUUID A 生成有效版本 1 TimeUUID B 的函数 increment(uuid),其中:

  1. 乙>甲
  2. 存在 NO C 其中 B > C > A

给定版本 1 TimeUUID A 的 decrement(uuid) 也会产生有效的版本 1 TimeUUID B,其中:

  1. 乙<甲
  2. 存在 NO C 其中 B < C < A
4

1 回答 1

0

版本 1 uuid 排序在时间戳时钟序列字段中表示。时间戳是一个 60 位的日期戳(代表 100 纳秒的时间增量,fwiw),而时钟序列是一个 14 位的计数器,可确保在给定时钟周期内生成的 uuid 是唯一的。因此,您可以将 v1 uuid 视为具有 74 位序列号,时间戳为高位,时钟序列为低位。因此,要以原子方式将 UUID 加一,您只需要...

  1. 解析出时间戳和时钟序列字段
  2. 将时钟序列加一
  3. 如果时钟序列 >= 2^^14,将其设置为零并将时间戳字段加一
  4. 将字段写回原始 UUID。

请注意,由于包含时钟序列的两个八位字节也包含 uuid 变体,因此步骤 #1 和 #4 稍微复杂一些,因此您需要进行一些按位操作来提取/设置 14-时钟序列的位。

要减少 uuid,只需重复上述操作,除了步骤 2 和 3,如果时钟序列为零,则将其设置为 2^^14-1,并将时间戳减一。

最后,如果 60 位时间戳上溢/下溢,您必须自己决定要做什么。鉴于时间戳 0 意味着 UUID 是在莎士比亚结婚时(公元 1582 年)生成的,而时间戳 2^^60-1 意味着它是由您的(伟大的^^150)孙子在公元 5238 年生成的..我希望这不是太大的问题。

于 2012-10-19T19:02:59.593 回答