【问题标题】:What is the probability of guessing (matching) a Guid?猜测(匹配)Guid 的概率是多少?
【发布时间】:2011-06-20 04:27:19
【问题描述】:

只是好奇,但匹配 Guid 的概率是多少?

从 SQL 服务器说一个 Guid:5AC7E650-CFC3-4534-803C-E7E5BBE29B3D

是阶乘吗?:(36*32)! = (1152)!

讨论 =D

【问题讨论】:

  • 让我们想一想……如果 GUID 中只有两个字符,会是 (2*36)! ? 36*36 听起来更有可能...计算出三个字符,然后看看哪个答案看起来有意义。
  • 为什么你会认为它是阶乘。只有当你不能重复值时才会出现这种情况。
  • 我敢打赌,这些字段中只有一个(例如 E7E5BBE29B3D)是随机的。其他是固定的(例如通过主机或服务器实例)或基于当前时间。这严重降低了可能性。
  • 我在想 26 个字母加上 10 个可能的数字使 GUID 中的单个位置(不包括破折号)有 36 个可能的值。不知道为什么我在想阶乘,也许是粗略的记忆! =\

标签: math guid probability


【解决方案1】:

它是 1 /(具有给定 UID 长度的唯一数字的数量)。在上面的示例中,我们看到 16 个字节或 128 位。 2^128,所以匹配的概率是 1 / 2^128。

【讨论】:

    【解决方案2】:

    可能的 GUID 数量(128 位值)为 2^128 或 3.4×10^38 — 大约每立方毫米地球整个体积 2 万亿。

    换句话说,有点低。

    (地球体积参考来源:维基百科)

    【讨论】:

      【解决方案3】:

      取决于 GUID 生成算法的类型。当前算法使用 124 个随机位,因此概率为 2^124 中的 1。

      使用旧算法(使用时间和 MAC 地址)的概率要高得多。

      【讨论】:

        【解决方案4】:

        您的计算存在许多问题。 首先,36*32 意味着任何字母数字字符都可以是 GUID 的一部分。不是这种情况;只允许使用 HEX 字符。

        其次,唯一 GUID 数量的计算是 有效字符数(16:0-9,A-F)^ GUID 长度(32 个字符)

        所以我们有 16^32 ==> 2^(4^32) ==> 2^128

        猜出任何一个 GUID 的几率是 1 / 2^128。

        【讨论】:

        • 这假定 GUID 的每个单个字节都是真正随机的。为了确保 GUID 在主机之间是唯一的,UUID 的大部分部分实际上是固定的(例如 MAC 地址)。然后用当前时间填充其余部分,并且几个字节是随机的。当您知道一些先前生成的 UUID 时,即使是那些随机字节也是可以猜测的。)比如说 48 位 MAC 地址 + 64 位微时间。 128-48-64=16。我会说赔率更接近 2^16 而不是 2^128。
        【解决方案5】:

        这取决于生成了多少 GUID。这类似于统计学中的生日问题。见维基百科和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”

        【讨论】:

          【解决方案6】:

          不清楚你在问什么。我看到了两种解释您的问题的方法。

          1. 给定一个 GUID g,有人猜到它的概率是多少?为简单起见,我们假设 GUID 的所有 128 位都可用。那么猜到g的概率就是2^-128。那是很小的。让我们对此有一些直觉。假设我们的攻击者每秒可以生成 10 亿个 GUID。为了有 50% 的几率猜到 g,我们的攻击者必须生成 2^127 个 GUID。以每秒 10 亿的速度,生成 2^127 个 GUID 需要 5391448762278159040348 年。

          2. 我们正在生成一个 guid 集合。发生碰撞的可能性有多大?也就是说,我们生成两个具有相同值的 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 的碰撞几率。

          【讨论】:

          • 2^64 是否正确? 2^128 的一半是 2^127。统计数据不是我的强项,所以也许只需要 sqrt(n) 就可以达到 50% 的阈值。
          猜你喜欢
          • 2019-02-04
          • 2012-11-01
          • 2018-04-13
          • 1970-01-01
          • 2018-05-15
          • 2020-07-28
          • 1970-01-01
          • 2016-04-15
          • 2021-08-12
          相关资源
          最近更新 更多