我不太擅长统计数学等。我一直在想,如果我使用以下内容:
import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])
double_str
字符串是否像unique_str
一样唯一,或者更独特一些?此外,这样做是否有负面影响(例如某些生日问题的情况等)?这听起来可能是无知的,但是由于我的数学充其量只是2代数,所以我根本不知道。
最佳答案
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
求平方。
关于math - 关于Python的uuid4的数学问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4306420/