【问题标题】:Math question regarding Python's uuid4关于 Python 的 uuid4 的数学问题
【发布时间】:2010-11-29 17:39:42
【问题描述】:

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

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

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

【问题讨论】:

  • 唯一性是一个连续体吗? “更独特”总是令人费解,即使您能理解其含义。
  • @Fred - uuid4 不保证不会产生冲突。如果是这样,我就不会担心这样做了。

标签: math random unique uuid unique-key


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 是的,需要担心的是随机数生成器的初始化不当,而不是发生碰撞的可能性很小。
  • 我不明白。你们是指Python错误地初始化随机数生成器吗? uuid4 不需要我提供随机数生成器。我错过了什么吗?
  • @orokusaki:如果您不初始化随机数生成器,将使用默认行为,这可能意味着系统时间可以用作种子。系统时间根本不是很随机 - 如果时间恰好相同,两台不同的计算机将生成相同的“随机”数字。见:docs.python.org/library/random.html#random.seed
  • @Mark - 好的,所以我在使用uuid4() 之前运行random.seed('some long string')?我是否也必须在种子中使用随机数(即每次使用时更改种子),还是应该只提供一个非常大的哈希值,并且每次都使用相同的东西?文档不是很清楚。
  • @orokusaki:不,你不应该那样做——那肯定会重复。您需要使用一些真正的随机性来源。
【解决方案2】:

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

另见When should I use uuid.uuid1() vs. uuid.uuid4() in python?

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你不是在不需要的时候用完另一个 UUID 来减少 PRNG 的周期吗?如果您减少获得重复随机数所需的时间,您的独特性就不是平方的。
    • @bot403,是的,您减少了周期,但这取决于 PRNG 中的熵量是否重要。
    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2011-01-12
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多