去掉所有字母和破折号的 UUID 是唯一的概率是多少?

What is the probability that a UUID, stripped of all of its letters and dashes, is unique?

假设我有一个 UUID a9318171-2276-498c-a0d6-9d6d0dec0e84

然后我删除所有字母和破折号得到 9318171227649806960084

给定一组以相同方式生成的 ID,这是唯一的概率是多少?这与一组普通的 UUID 相比如何?

UUID 表示为 32 个十六进制(base-16)数字,显示为 5 组,用连字符分隔。您的问题是,对于任何生成的 UUID,我们 可以从 [0-9,A-F] 集合中获取任何有效的十六进制数 ,包括在内。

这让我们进退两难,因为我们事先不知道为每个 UUID 生成的十六进制数字中有多少是字母字符:[A-F] .我们唯一可以确定的是,UUID 的每个生成字符都有 5/16 的机会是字母字符:[A-F]。知道这一点就不可能准确地回答这个问题,因为删除连字符和字母字符 为每个生成的 UUID 留给我们可变长度的 UUID...

话虽如此,为了给您一些思考,我们知道每个 UUID 的长度为 36 个字符,包括连字符。所以如果我们简化并说,我们没有连字符,现在每个 UUID 的长度只能是 32 个字符。在此基础上,如果我们进一步简化并说 32 个字符中的每一个都只能是数字字符:[0-9],我们现在可以给出每个生成的、简化的 UUID 的唯一性的 准确概率(根据到我们上面提到的简化):

假设一个UUID由32个字符表示,其中每个字符都是[0-9]集合中的一个数字字符。我们知道我们需要生成 32 个数字才能创建有效的简化 UUID。现在选择任何给定数字的机会:[0-9] 是 1/10。另一种思考方式如下:每个数字都有均等的生成机会,因为有 10 个数字:每个数字都有 10% 的生成机会。

此外,当生成一个数字时,该数字的生成独立于先前生成的数字,即生成的每个数字不依赖于先前生成的数字的结果。因此,对于生成的 32 个数字字符中的每一个,:每个数字都是 相互独立,并且由于选择的任何数字的结果都是一个数字和只有 [0-9] 中的一个数字,我们可以说每个选择的数字都是 互斥的

了解这些事实后,我们可以利用 Product 规则,该规则规定两个独立事件发生的 概率是它们各自概率 的乘积。例如,两次抛硬币出现两次正面朝上的概率是 0.5 x 0.5 或 0.25。因此,生成两个相同的 UUID 将是:

1/10 * 1/10 * 1/10 * .... * 1/10 where the number of 1/10s would be 32.

简化为 1/(10^32),或者一般来说:简化为 1/(10^n) where n is the length of your UUID. 因此,综上所述,根据我们的假设,生成两个唯一 UUID 的可能性 无限小。

希望对您有所帮助!