我对统计数学等不太了解。我一直在想,如果我使用以下内容:
import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])
double_str
字符串是否与unique_str
一样唯一,或者只是更加独特?此外,做这样的事情(比如生日问题情况等)是否有任何负面影响?这可能听起来很无知,但我根本不会知道,因为我的数学充其量只能代数代数。
答案 0 :(得分:18)
uuid4
函数返回从16个随机字节创建的UUID,极不太可能产生冲突,甚至可能不应该担心它。
如果出于某种原因,uuid4
会产生重复,则更有可能是编程错误,例如无法正确初始化随机数生成器而不是真正的坏运气。在这种情况下,您使用它的方法将不使其更好 - 即使您的方法,错误初始化的随机数生成器仍然可以产生重复。
如果您使用默认实现random.seed(None)
,您可以在source中看到,只有16个字节的随机性用于初始化随机数生成器,因此这是一个您必须解决的问题第一。此外,如果操作系统不提供随机源,则将使用系统时间,而不是非常随机。
但是忽略这些实际问题,你基本上是在正确的方向。要使用数学方法,我们首先必须通过“唯一性”来定义您的意思。我认为合理的定义是在生成重复的概率超过某个概率p
之前需要生成的id的数量。一个适用的公式是:
其中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)
这取决于随机数生成器,但它几乎是平方的唯一性。