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



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

然后我删除所有字母和破折号以获得9318171227649806960084.

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

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

这给我们留下了一个两难的境地,因为我们事先不知道为每个UUID生成的十六进制数字中有多少是字母字符:[A-F]。我们唯一可以确定的是,UUID 的每个生成字符都有 5/16 的几率成为 alpha 字符:[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] 中的数字,我们可以说每个选择的数字相互排斥

了解了这些事实,我们可以利用乘积规则,该规则指出两个独立事件发生的概率是它们各自概率的乘积。例如,两次抛硬币获得两个正面的概率是 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 的可能性非常小。

希望对您有所帮助!

最新更新