说我有一个UUID a9318171-2276-498c-a0d6-9d6d0dec0e84
。
然后我删除所有字母和破折号以获得9318171227649806960084
。
在给定一组以相同方式生成的ID的情况下,这是唯一的概率是多少?这与一组普通的UUID相比如何?
UUID表示为32个十六进制(基数为16)的数字,显示在由连字符分隔的5个组中。您的问题的问题是,对于任何生成的UUID,我们可以从[0-9,A-F]的集合中获取任何有效的十六进制数。
这使我们陷入两难境地,因为事先我们不知道为每个UUID生成的十六进制数字中有多少是alpha-characte:[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的可能性是无限小的。
希望这有帮助!