Python:ueid.uuid1()在wheezy / virtualbox上的唯一性测试失败

时间:2013-11-15 17:41:37

标签: python debian virtual-machine virtualbox uuid

用于测试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)上发布此内容,将其转发给更广泛的受众群体,可能会更快回答。

1 个答案:

答案 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而极不可能。在足够长的时间内,既不保证也不可能保证唯一性。