关于Python的uuid4的数学问题

时间:2010-11-29 17:39:43

标签: math random unique uuid unique-key

我对统计数学等不太了解。我一直在想,如果我使用以下内容:

import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])

double_str字符串是否与unique_str一样唯一,或者只是更加独特?此外,做这样的事情(比如生日问题情况等)是否有任何负面影响?这可能听起来很无知,但我根本不会知道,因为我的数学充其量只能代数代数。

3 个答案:

答案 0 :(得分:18)

uuid4函数返回从16个随机字节创建的UUID,不太可能产生冲突,甚至可能不应该担心它。

如果出于某种原因,uuid4 会产生重复,则更有可能是编程错误,例如无法正确初始化随机数生成器而不是真正的坏运气。在这种情况下,您使用它的方法将使其更好 - 即使您的方法,错误初始化的随机数生成器仍然可以产生重复。

如果您使用默认实现random.seed(None),您可以在source中看到,只有16个字节的随机性用于初始化随机数生成器,因此这是一个您必须解决的问题第一。此外,如果操作系统不提供随机源,则将使用系统时间,而不是非常随机。

但是忽略这些实际问题,你基本上是在正确的方向。要使用数学方法,我们首先必须通过“唯一性”来定义您的意思。我认为合理的定义是在生成重复的概率超过某个概率p之前需要生成的id的数量。一个适用的公式是:

alt text

其中d对于单个随机生成的uuid为2**(16*8)2**(16*2*8)为您建议的方法。公式中的平方根确实归因于Birthday Paradox。但是,如果你解决这个问题,你可以看到,如果你在保持d不变的同时将值p的范围平方,那么你也将n平方。

答案 1 :(得分:1)

由于uuid4基于伪随机数生成器,因此调用它两次不会使“唯一性”的数量达到平方(甚至可能根本不添加任何唯一性)。

另见When should I use uuid.uuid1() vs. uuid.uuid4() in python?

答案 2 :(得分:-1)

这取决于随机数生成器,但它几乎是平方的唯一性。