首页 > 解决方案 > 如何生成可按时间排序的唯一 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 将同时生成,即有可能两次单独执行的时间参数相同(可能性很小,但确实存在),但 ID 应该不同。

Python/3rd 方模块中是否已经存在类似的东西?如果不是,最好的方法是什么?甚至可以像这样生成ID吗?

标签: pythonuuid

解决方案


就在这里。您可以使用uuid然后该uuid1()功能提供您想要的功能:

 uuid.uuid1(0, 0)

将提供类型为 1 的 UUID,节点 ID 为 0,时钟序列为 0。剩余的 60 位将是单调递增的时间序列,因此是可排序的。

您可以根据需要为每个进程使用不同的节点 ID(然后,排序将按节点顺序进行:首先是节点 A 的所有 UUID,然后是节点 B 的所有 UUID),或者将 PID 作为时钟序列以确保没有两个进程将获得相同的 UUID(在这种情况下,排序时,UUID 将按时间顺序排序,然后按 PID 顺序):

可以这么说,

UUID  = NODENODE-NODE-CLOCKCLOCKCLOCKCLOCK-SEQSEQ

推荐阅读