关于Python的uuid4的数学问题

oro*_*aki 6 random math uuid unique unique-key

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

import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 18

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

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

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

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

替代文字

这里d2**(16*8)单个随机生成的UUID和2**(16*2*8)您的建议的方法.公式中的平方根确实是由于生日悖论.但是如果你解决了这个问题,你可以看到,如果你d在保持p不变的同时对数值范围进行平方,那么你也可以正方形n.

  • @orokusaki:不,你不应该这样做 - 这肯定会给重复.你需要使用一些真正的随机源. (4认同)
  • @orokusaki:如果你没有初始化随机数生成器,将使用默认行为,这可能意味着系统时间可以用作种子.系统时间根本不是随机的 - 如果时间恰好相同,两台不同的计算机将生成相同的"随机"数字.请参阅:http://docs.python.org/library/random.html#random.seed (2认同)