如何递增/递减随机(类型4)UUID?

时间:2012-10-10 20:42:48

标签: algorithm cassandra guid uuid

如何实现给定版本4 UUID A生成有效版本4 UUID B的函数增量(uuid),其中:

  1. B> A
  2. 存在NO C,其中B> C> A
  3. 同样的减量(uuid)给定版本4 UUID A产生有效版本4 UUID B其中:

    1. B< A
    2. 存在NO C,其中B < C&lt; A

2 个答案:

答案 0 :(得分:0)

不可能。除了为版本和变体字段保留的6位之外,v4 UUID由完全随机的数据组成 - 即没有固有的“序列”概念,在其中定义有意义的递增/递减操作。

答案 1 :(得分:0)

这是一个实现你想要的python函数:

def increment_uuid(uuid, increment):
    # Return a UUID value incremented by an integer

    hex_str = uuid[:8] + uuid[9:13] + uuid[14:18] + uuid[19:23] + uuid[24:]
    incremented_val = int(hex_str, 16) + increment
    assert(incremented_val >= 0 and incremented_val <= 2 ** 128)
    incremented_hex = format(incremented_val, '032x')
    incrmented_uuid = incremented_hex[:8] + '-' + incremented_hex[8:12] + '-' + incremented_hex[12:16] \
                      + '-' + incremented_hex[16:20] + '-' + incremented_hex[20:]
    return incrmented_uuid   

现在,您只需将UUID增加1即可获得&#39;序列中的下一个&#39;:

import uuid
uuid_a = uuid.uuid4() # e.g. a32258b5-2781-44ec-9e00-f4b1185e9936
uuid_b = increment_uuid(str(uuid_a),1) # e.g. a32258b5-2781-44ec-9e00-f4b1185e9937

当然,它只是将数据视为128位十六进制值,并忽略对版本号和变体位的约束。