math - 关于Python的uuid4的数学问题

标签 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一样唯一,或者更独特一些?此外,这样做是否有负面影响(例如某些生日问题的情况等)?这听起来可能是无知的,但是由于我的数学充其量只是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/

相关文章:

PostgreSQL - 如何分别区分两列?

Java-为什么这两个在计算 k^2+1 形式的素数时给出不同的输出?

javascript - 创建具有随机 0 和 1 值的矩阵的代码

django - 如何在 Django 中限制静态文件上传的用户?

java - 如何对用户在 Java 中定义的随机生成的数字进行排序?

r - 如何知道一个向量是否由相同的元素组成?

file - 如何在不相互比较的情况下发现相同的文件?

php - PHP 中 MySQL DECIMAL 数据类型的数学运算

math - 棘手的柏林噪声问题。 Grad 函数如何使用归一化向量?

python - 为什么Python的内置数学运算符在处理大数时很慢?