【问题标题】:How to increment/decrement a (version 1) TimeUUID?如何增加/减少(版本 1)TimeUUID?
【发布时间】:2012-10-10 20:44:47
【问题描述】:

如何实现给定版本 1 TimeUUID A 的函数 increment(uuid) 会产生 valid 版本 1 TimeUUID B 其中:

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

对于给定版本 1 TimeUUID A 的减量 (uuid) 也是如此,它会生成 有效 版本 1 TimeUUID B,其中:

  1. B
  2. 存在 NO C 其中 B

【问题讨论】:

    标签: algorithm cassandra guid uuid


    【解决方案1】:

    版本 1 的 uuid 排序在 timestampclock sequence 字段中表示。时间戳是一个 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,并将时间戳减1。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多