6

我不擅长统计数学等。我一直在想,如果我使用以下内容:

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

double_str字符串的平方是唯一的还是unique_str更唯一的?另外,做这样的事情是否有负面影响(比如一些生日问题等)?这听起来可能很无知,但我根本不知道,因为我的数学最多只能跨越代数 2。

4

3 回答 3

18

uuid4函数返回一个由 16 个随机字节创建的 UUID,并且不可能产生冲突,以至于您可能甚至不应该担心它。

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

如果您使用默认实现random.seed(None),您可以在源代码中看到仅使用 16 个字节的随机性来初始化随机数生成器,因此这是您必须首先解决的问题。此外,如果操作系统不提供随机源,系统时间将被使用,这根本不是随机的。

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

替代文字

whered2**(16*8)一个随机生成的 uuid 和2**(16*2*8)您建议的方法。公式中的平方根确实是由于生日悖论。但是如果你计算出来,你会发现如果你d在保持p不变的同时对值的范围进行平方,那么你也是平方n

于 2010-11-29T17:45:22.580 回答
1

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

另请参阅何时应该在 python 中使用 uuid.uuid1() 与 uuid.uuid4()?

于 2010-11-29T17:45:05.310 回答
-1

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

于 2010-11-29T17:44:35.840 回答