如何生成类似时间可排序的唯一 ID?
How to generate a unique ID which is time-like sortable?
有没有一种方法可以生成一个普遍唯一的 ID,该 ID 的值始终在生成“时间”时递增?对于这个问题,我们只能假定 UTC 时区。
我所说的类时间排序能力的具体意思是:
from time import sleep
id1 = generate_unique_id()
sleep(1)
id2 = generate_unique_id()
sleep(1)
id3 = generate_uniqueid()
assert id1 < id2
assert id2 < id3
所以id1可以是"abcdefgh-ksfn-123"
,id2可以是"abcdefgh-ksfn-231"
等等
我真的不希望直接使用 UTC 时间戳作为 ID,因为它确实包含一些我不希望向使用此 ID 的用户公开的信息。我们还可以假设这个 ID 将同时生成,即有可能 2 次单独执行的时间参数相同(可能性很小,但它存在),但 ID 应该不同。
Python/3rd 派对模块中是否已经存在类似的东西?
如果不是最好的方法是什么?甚至可以生成这样的 ID 吗?
考虑从时间模块 (https://docs.python.org/3/library/time.html) 中检查单调时间 - 它 returns 时钟的小数秒数只会增加,所以你会得到随着时间增加的数字.例如,这些是我 运行 以下内容时的结果:
print(time.monotonic()) # 5052906.443107647
time.sleep(1)
print(time.monotonic()) # 5052907.446823377
time.sleep(1)
print(time.monotonic()) # 5052908.448060763
然后你可以对数字进行一些压缩,如果你想让 ID 更合适的话,也许可以添加一些字母,但这至少会让你增加数字加班
我认为这对你有用。
import time
# 1600528948.9750373
id1 = int(str(time.time()).replace(".",""))
# 16005289641753972
id2 = int(str(time.time()).replace(".",""))
# 16005289668820095
是的,有。您可以使用 uuid
然后 uuid1()
函数提供您想要的:
uuid.uuid1(0, 0)
将提供一个 UUID 类型 1,节点 ID 为 0,时钟序列为 0。其余 60 位将是一个单调递增的时间序列,因此可以排序。
如果需要,您可以为每个进程使用不同的节点 ID(然后,排序将按节点顺序进行:首先是节点 A 的所有 UUID,然后是节点 B 的所有 UUID),或者 PID 作为时钟顺序以确保没有两个进程将获得相同的 UUID(在这种情况下,排序时,UUID 将按时间顺序排序,然后按 PID 顺序排序):
可以这么说,
UUID = NODENODE-NODE-CLOCKCLOCKCLOCKCLOCK-SEQSEQ
有没有一种方法可以生成一个普遍唯一的 ID,该 ID 的值始终在生成“时间”时递增?对于这个问题,我们只能假定 UTC 时区。
我所说的类时间排序能力的具体意思是:
from time import sleep
id1 = generate_unique_id()
sleep(1)
id2 = generate_unique_id()
sleep(1)
id3 = generate_uniqueid()
assert id1 < id2
assert id2 < id3
所以id1可以是"abcdefgh-ksfn-123"
,id2可以是"abcdefgh-ksfn-231"
等等
我真的不希望直接使用 UTC 时间戳作为 ID,因为它确实包含一些我不希望向使用此 ID 的用户公开的信息。我们还可以假设这个 ID 将同时生成,即有可能 2 次单独执行的时间参数相同(可能性很小,但它存在),但 ID 应该不同。
Python/3rd 派对模块中是否已经存在类似的东西? 如果不是最好的方法是什么?甚至可以生成这样的 ID 吗?
考虑从时间模块 (https://docs.python.org/3/library/time.html) 中检查单调时间 - 它 returns 时钟的小数秒数只会增加,所以你会得到随着时间增加的数字.例如,这些是我 运行 以下内容时的结果:
print(time.monotonic()) # 5052906.443107647
time.sleep(1)
print(time.monotonic()) # 5052907.446823377
time.sleep(1)
print(time.monotonic()) # 5052908.448060763
然后你可以对数字进行一些压缩,如果你想让 ID 更合适的话,也许可以添加一些字母,但这至少会让你增加数字加班
我认为这对你有用。
import time
# 1600528948.9750373
id1 = int(str(time.time()).replace(".",""))
# 16005289641753972
id2 = int(str(time.time()).replace(".",""))
# 16005289668820095
是的,有。您可以使用 uuid
然后 uuid1()
函数提供您想要的:
uuid.uuid1(0, 0)
将提供一个 UUID 类型 1,节点 ID 为 0,时钟序列为 0。其余 60 位将是一个单调递增的时间序列,因此可以排序。
如果需要,您可以为每个进程使用不同的节点 ID(然后,排序将按节点顺序进行:首先是节点 A 的所有 UUID,然后是节点 B 的所有 UUID),或者 PID 作为时钟顺序以确保没有两个进程将获得相同的 UUID(在这种情况下,排序时,UUID 将按时间顺序排序,然后按 PID 顺序排序):
可以这么说,
UUID = NODENODE-NODE-CLOCKCLOCKCLOCKCLOCK-SEQSEQ