使用Python的UUID生成唯一ID,我是否仍应检查重复项?

时间:2014-06-01 18:30:22

标签: python uuid uniqueidentifier

我正在使用Python的UUID函数为要存储在数据库中的对象创建唯一ID:

>>> import uuid
>>> print uuid.uuid4()
2eec67d5-450a-48d4-a92f-e387530b1b8b

可以假设这确实是一个唯一的ID吗?

或者我应该仔细检查是否尚未针对我的数据库生成此唯一ID,然后再将其视为有效。

3 个答案:

答案 0 :(得分:5)

你应该总是有一个重复的支票,即使赔率非常好,你总是可以有重复的。

我建议您只在数据库中添加重复键约束,并在重试时出现错误。

答案 1 :(得分:3)

我会使用uuid1,因为它在生成UUID时需要考虑日期/时间,因此它没有碰撞的可能性(除非你同时生成大量的UUID)。

您实际上可以reverse the UUID1值来检索用于生成它的原始纪元时间。

uuid4生成的随机ID与先前生成的值相冲突的可能性非常小,但是因为它不使用单调增加的纪元时间作为输入(或将其包含在输出uuid中),以前生成的值在将来再次生成的可能性非常小。

答案 2 :(得分:2)

只要你在同一个系统上创建所有uuids,除非python实现中有一个非常严重的缺陷(我真的不能想象),RFC 4122声明它们都是不同的(编辑过的) :如果使用版本1,3或5)。

UUID可能出现的唯一问题是,如果两个系统在同一时刻完全创建UUID并且:

  • 在他们的网卡上使用相同的MAC地址(非常罕见)并且您使用的是UUID版本1
  • 或使用相同的名称,您使用的是UUID版本3或5
  • 或获得相同的随机数,您使用的是UUID版本4(*)

因此,如果您拥有真实的MAC地址或使用官方DNS名称或唯一的LDAP DN,您可以认为生成的uuids将是全局唯一的。

所以恕我直言,你只需要检查unicity,如果你想阻止你的应用程序抵御恶意攻击试图自愿使用一个existant uuid。

编辑: 正如Martin Konecny所说,在uuid4中,时间戳部分也是随机的而不是单调的。所以碰撞可能是非常有限但不是0。