我正在使用Python的UUID函数为要存储在数据库中的对象创建唯一ID:
>>> import uuid
>>> print uuid.uuid4()
2eec67d5-450a-48d4-a92f-e387530b1b8b
可以假设这确实是一个唯一的ID吗?
或者我应该仔细检查是否尚未针对我的数据库生成此唯一ID,然后再将其视为有效。
答案 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地址或使用官方DNS名称或唯一的LDAP DN,您可以认为生成的uuids将是全局唯一的。
所以恕我直言,你只需要检查unicity,如果你想阻止你的应用程序抵御恶意攻击试图自愿使用一个existant uuid。
编辑: 正如Martin Konecny所说,在uuid4中,时间戳部分也是随机的而不是单调的。所以碰撞可能是非常有限但不是0。