Python的uuid1是按时间顺序排列的吗?

14 投票
5 回答
7776 浏览
提问于 2025-04-17 09:27

Python的文档提到,uuid1是通过当前时间来生成uuid值的。不过,我找不到任何说明,确保UUID1是按顺序生成的。

>>> import uuid
>>> u1 = uuid.uuid1()
>>> u2 = uuid.uuid1()
>>> u1 < u2
True
>>> 

5 个回答

5

来自Python的UUID文档

根据主机ID、序列号和当前时间生成一个UUID。如果没有提供节点信息,就会使用getnode()来获取硬件地址。如果提供了时钟序列号,它将作为序列号使用;否则会随机选择一个14位的序列号。

从这段话中,我理解到,生成UUID时,首先会用到MAC地址,然后是一个(可能是随机的)序列号,最后是当前时间。所以我不认为这些生成的UUID会保证是单调递增的,即使是同一台机器或进程生成的UUID也不一定会这样。

13

UUID 不是顺序的

不,标准的 UUID 并不是设计成顺序的。

显然,有人尝试过让 GUID(微软对 UUID 的改进版)变得顺序,以便在某些数据库场景中提高性能。但UUID 的初衷并不是要顺序http://en.wikipedia.org/wiki/Globally_unique_identifier

MAC 地址在最后,不在最前

不,在标准的 UUID 中,MAC 地址 不是第一个部分。MAC 地址是版本 1 UUID 中的 最后一个部分。http://en.wikipedia.org/wiki/Universally_unique_identifier

不要假设 UUID 的类型

不同版本的 UUID 之间是可以兼容的。所以,期待你总是使用版本 1 的 UUID 可能不太合理。其他程序员可能会使用其他版本。

规范

可以阅读 UUID 的规范,RFC 4122,由 IETF 发布。只有十几页长。

15

但并不是总是这样:

>>> def test(n):
...     old = uuid.uuid1()
...     print old
...     for x in range(n):
...             new = uuid.uuid1()
...             if old >= new:
...                     print "OOops"
...                     break
...             old = new
...     print new
>>> test(1000000)
fd4ae687-3619-11e1-8801-c82a1450e52f
OOops
00000035-361a-11e1-bc9f-c82a1450e52f

撰写回答