代码之家  ›  专栏  ›  技术社区  ›  Tom Savage

假设GUID总是唯一的安全吗?

  •  98
  • Tom Savage  · 技术社区  · 15 年前

    我知道发生冲突的可能性很小,但如果我生成了一批1000个guid(例如),是否可以安全地假设它们都是唯一的,以保存对每个guid的测试?

    测试GUID唯一性的最佳方法是什么?布卢姆过滤器?

    6 回复  |  直到 12 年前
        1
  •  372
  •   Community CDub    8 年前

    是的,你可以。由于guid的长度是128位,因此不可否认,有一种很小的可能会出现clash,但是单词“minute”远不够强大。有 这么多的guid 几万亿 其中随机的,你仍然更有可能被陨石击中,而不是有一次碰撞(从地球上) Wikipedia ). 如果不是随机生成,而是 例如 你的 计算机。

    编辑1: 为了回答您的额外问题,测试一组guid唯一性的最佳方法就是假设它们都是唯一的。为什么?因为,考虑到你生成的GUID的数量,GUID冲突的几率要小于宇宙射线在你的计算机内存中翻转一点,并把你想运行的任何“精确”算法给出的答案搞砸的几率(看到了吗 this StackOverflow answer 为了数学。)

    有一个 巨大的 银河系搭便车指南 :

    既然有 about 7×10 22 stars in the universe 128 GUIDs,那么大约有4.8610个 几乎 每颗星星的图形符号。如果每一颗恒星都有一个像我们这样人口繁衍的世界,那么在每一颗恒星周围, every human or alien who had ever lived 将有权获得四万五千多个guid。为了历史上的每一个人,为了宇宙中的每一颗星星。GUID空间的巨大程度与整个宇宙的大小相同。你知道吗 我需要担心。

    ( 编辑2:

        2
  •  43
  •   Community CDub    8 年前

    我计算了一些有代表性的碰撞概率。具有中指定的122位uuid the Wikipedia article ,如果生成至少 2.71492e18

    Some numbers for comparison can be found on Wikipedia. 因此,你可以安全地为每一个生活过的人类、可观测宇宙中的每个星系、海洋中的每一条鱼以及地球上的每一只蚂蚁分配一个UUID。 然而 ,如果你为人类一年内生产的每一个晶体管、地球上的每一只昆虫、地球上的每一粒沙子、可观测宇宙中的每一颗恒星或任何更大的物体生成一个UUID,碰撞几乎是肯定的。

    如果每秒生成10亿个uuid, it would take about 36 years 得到10%的碰撞概率。

    最终,在人类历史进程中产生的一组uuid之间可能会发生冲突。不过,发生碰撞的uuid用于相同目的的概率非常小,因此在实践中没有问题。

        3
  •  8
  •   Mark Ransom    15 年前

    维基百科上提供了碰撞可能性的分析: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

    如链接中所述,这将受到随机数生成器属性的影响。

    布卢姆过滤器可能是合适的;它可以快速地告诉您GUID是否唯一,但是有可能出现错误的冲突指示。如果一次测试一个批,另一种方法是对批进行排序并比较每个连续的元素。

        4
  •  5
  •   John Saunders    15 年前

    一般来说,是的,这是可以肯定的假设。

    当然,这需要一个好的GUID生成器。所以问题是你对生成GUID的工具有多信任,它有自己的测试吗?

        5
  •  0
  •   Community CDub    8 年前

    虽然有可能发生碰撞,但可能性很小(数学 here )可以肯定的是,它们实际上是不同的。

        6
  •  0
  •   Community CDub    8 年前
        7
  •  0
  •   user3004984    4 年前

    这个话题让我想起一副纸牌场景。这就是说,有这么多的方法可以安排一副牌52张,它几乎可以肯定的是,没有2个适当洗牌牌牌组曾经存在过,一直在同一顺序。

    在这个例子中,有40个被洗牌的牌组,并且想要确定它们都是独一无二的,这不是不可能的,其中的2个是相同的,但是如果你能够每十分之一秒洗牌一次所有的牌组,并且你从宇宙诞生时就开始了,那么这很可能不会发生。