说我有一个UUID a9318171-2276-498c-a0d6-9d6d0dec0e84
。
然后我删除所有字母和破折号以获得9318171227649806960084
。
给定以相同方式生成的一组ID,这种可能性唯一的可能性是多少?与普通的UUID相比如何?
答案 0 :(得分:1)
UUID表示为32个十六进制(以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的可能性极小。
希望有帮助!