python - 如何生成可按时间排序的唯一 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吗?
解决方案
就在这里。您可以使用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
推荐阅读
- laravel - Maatwebsite CSV 导出中的 Laravel-Excel UTF8 问题
- apache - Mojolicious url_for 操作在 web 服务中不安全
- c# - C# 不能使 `notnull` 类型可以为空
- xml - XML DTD 验证错误:元素类型“图表”的内容必须匹配
- python - 在一个对象中打印所有属性的类型 - 最好的方法?
- php - 如何使用 Jquery 使下拉列表依赖于 laravel 中的另一个下拉列表?
- mysql - 按顺序条件对表进行排序?
- php - 关系数据不会出现在 laravel 视图中
- mysql - 对于员工表中的每个员工,查找层次结构中直接和间接老板的数量
- python - 我想要这个 Tkinter 画布可滚动,获取复选框的输出以选择列