GUID 100%是唯一的吗?
它会在多个线程中保持唯一吗?
GUID 100%是唯一的吗?
它会在多个线程中保持唯一吗?
当前回答
足够的guid来为可见宇宙中每一颗恒星周围的每一颗假设行星上的每一颗假设沙粒分配一个guid。
以至于如果世界上的每台计算机每秒生成1000个guid,持续200年,就可能发生碰撞。
考虑到当前guid的本地使用数量(例如,每个数据库每个表一个序列),这对于我们这些有限的生物来说是非常不可能成为问题的(对于手机来说,寿命通常不到十年,如果不是一两年的话)。
... 我们现在可以结束这个话题了吗?
其他回答
而每个生成的GUID不是 保证是唯一的,总数 唯一键数(2128或 3.4×1038)是如此之大,相同的数字的概率是 生成两次是非常小的。为 例如,考虑可观察对象 宇宙,其中包含约5×1022 星星;每颗恒星都有可能 6.8×1015通用唯一的guid。
从维基百科。
这是一些关于如何创建GUID(用于。net)以及如何在正确的情况下获得相同的GUID的好文章。
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
足够的guid来为可见宇宙中每一颗恒星周围的每一颗假设行星上的每一颗假设沙粒分配一个guid。
以至于如果世界上的每台计算机每秒生成1000个guid,持续200年,就可能发生碰撞。
考虑到当前guid的本地使用数量(例如,每个数据库每个表一个序列),这对于我们这些有限的生物来说是非常不可能成为问题的(对于手机来说,寿命通常不到十年,如果不是一两年的话)。
... 我们现在可以结束这个话题了吗?
似乎没有人提到它发生概率的实际数学计算。
首先,让我们假设我们可以使用整个128位空间(Guid v4只使用122位)。
我们知道在n次选择中没有得到重复的一般概率是:
(1-1/2128)(1-2/2128)……(1 - (n - 1) / 2128)
因为2128比n大得多,我们可以将其近似为:
(1-1/2128) n (n - 1) / 2
因为我们可以假设n比0大很多很多,我们可以把它近似为:
(1-1/2128) n ^ 2/2
现在我们可以将其等同于“可接受的”概率,假设是1%:
(1-1/2128)n²/2 = 0.01
我们解出n,得到
N =√(2* log 0.01 / log (1-1/2128))
哪个Wolfram Alpha得到5.598318 × 1019
为了更好地理解这个数字,让我们以10000台机器为例,每台机器都有一个4核CPU,工作4Ghz,花费10000个周期来生成一个Guid,其他什么都不做。然后需要大约111年才能产生一个副本。
理论上讲,不,它们不是唯一的。可以反复生成相同的guid。然而,这种情况发生的几率非常低,你可以假设它们是独一无二的。
我以前读到过,这种可能性非常低,你真的应该关注其他事情——比如你的服务器自燃或代码中的其他错误。也就是说,假设它是唯一的,不要构建任何“捕获”重复的代码——把时间花在更有可能发生的事情上(即任何其他事情)。
我尝试向我的博客读者(非技术家庭成员)描述guid的有用性。从那里(通过维基百科),生成重复GUID的几率:
1 / 2^128 1 / 340的十一分之一(别担心,十一分之一不在 测试) 1 / 3.4 × 10^38 1 / 340,000,000,000,000,000,000,000,000,000,000,000,000,000,000
MSDN:
新Guid的值全为零或等于任何其他Guid的概率非常低。