好奇但匹配Guid的概率是多少?
从SQL服务器上说一个Guid:5AC7E650-CFC3-4534-803C-E7E5BBE29B3D
这是一个因素吗?:(36 * 32)! =(1152)!
讨论 = d
答案 0 :(得分:26)
目前尚不清楚你在问什么。我看到两种解释你问题的方法。
鉴于GUID g
,有人猜测它的概率是多少?为简单起见,我们假设GUID的所有128位都可用。然后猜测g
的概率是2^-128
。那很小。让我们对此有所了解。假设我们的攻击者每秒可以生成10亿个GUID。要有50%的机会猜测g
,我们的攻击者必须生成2 ^ 127个GUID。以每秒10亿的速度生成2 ^ 127个GUID需要5391448762278159040348年。
我们正在制作一系列guids。发生碰撞的可能性有多大?也就是说,我们生成具有相同值的两个guid的可能性是多少?这是生日悖论。如果你随机生成一个n GUID序列,那么至少有一次碰撞的概率大约是p(n) = 1 - exp(-n^2 / 2 * 2^128)
(这是生日问题,可能的生日数是2 ^ 128)。
n p(n)
2^30 1.69e-21
2^40 1.77e-15
2^50 1.86e-10
2^60 1.95e-03
因此,即使您生成2 ^ 60个GUID,碰撞的几率也非常小。如果你每秒可以产生10亿个GUID,那么发生碰撞的机率仍然需要36年才能达到1.95e-03。
答案 1 :(得分:6)
可能的GUID(128位值)的数量是2 ^ 128或3.4×10 ^ 38 - 大约2万亿每立方毫米的整个地球体积。
换句话说,有点低。
(地球卷参考资料来源:WikiPedia)
答案 2 :(得分:3)
取决于GUID生成算法的类型。当前算法使用124个随机位,因此概率为2 ^ 124中的1。
使用较旧的算法(使用时间和MAC地址)概率要高得多。
答案 3 :(得分:3)
你的计算有很多问题。 首先,36 * 32意味着任何字母数字字符都可以成为GUID的一部分。不是这种情况;只允许使用十六进制字符。
其次,唯一GUID数量的计算是 有效字符数(16:0-9,A-F)^ GUID长度(32个字符)
所以我们有16 ^ 32 ==> 2 ^(4 ^ 32)==> 2 ^ 128
猜测任何一个GUID的几率是1/2 ^ 128。
答案 4 :(得分:0)
它是1 /(给定UID长度可能的唯一数字的数量)。在上面的例子中,我们看到16个字节,或128位。 2 ^ 128,所以匹配的概率是1/2 ^ 128。
答案 5 :(得分:0)
这取决于生成的GUID数量。这类似于统计中的生日问题。请参阅Wikipedia和http://betterexplained.com/articles/understanding-the-birthday-paradox/(这个具体有一个GUID示例)
一般来说,在{N}个guid上产生M个guid的碰撞概率是1 - (1- (1/N))^C(M,2)
,其中C(M,2)
是'M选择2'