用于测试test_uuid.py中uuid.uuid1()的唯一性的Python测试用例在Virtualbox上的Debian Wheezy上失败了。但是,当我将其更改为使用uuid.uuid4()时,它总是成功的。我没有在裸机上安装wheezy进行测试。
我在我的虚拟机上安装Python 2.7.6时遇到了这个问题。这阻碍了成功安装。
失败的是uuid1能够在大多数时间内从1000次迭代中创建大约995-998个唯一的uuids。
任何人都可以对这次失败有所了解。我创建了一个小测试文件,如下所示。
import uuid
def test_uuid():
uuids = {}
for u in [uuid.uuid1() for i in range(1000)]:
uuids[u] = 1
print i+1, len(uuids.keys())
if i+1 != len(uuids.keys()): print 'FAIL'
else: print 'SUCCESS'
if __name__ == '__main__':
test_uuid()
请注意,我已在debian论坛(http://forums.debian.net/viewtopic.php?f=8&t=109067)上发布此内容,将其转发给更广泛的受众群体,可能会更快回答。
答案 0 :(得分:1)
类型1 UUID由以下内容组成(来自Cassandra wiki):
- 自1582年10月15日00:00:00.00(格里高利改革至基督教历法之日)起计算的100纳秒间隔的时间戳。
- 版本(值应为1)。
- 变体(值应为2)。
- 序列号,可以是计数器或伪随机数。
- A"节点"这将是机器的MAC地址(这应该使UUID在机器之间是唯一的)。
因此,假设您正在快速生成UUID(即,您对大量uuid.uuid1
次调用具有相同的时间戳 - 不一定是整数千个),唯一一个在生成一个uuid之间有所不同下一个是序列号。这是一个随机数,长度为14位(来自uuid.uuid1 docs):
如果' clock_seq'给出,它用作序列号; 否则选择随机的14位序列号。
这为您提供了16384种可能性。您从这个可能性池中选择(任何最多)1000个随机数,并期望获得1000个唯一数字。这是可能的,但由于birthday paradox而极不可能。在足够长的时间内,既不保证也不可能保证唯一性。