有没有一种方法可以使GUID 100%碰撞安全



我正在寻找一种方法来生成唯一字符串作为数据库的主键。我知道GUID的冲突概率很低,但我想知道是否有可能使用它来获得100%唯一的密钥(99.99唯一性是不够的;(

我正在使用ASP。NET Core v5,实体框架Core v5.0.1,SQL Server。

请注意,我想要不可猜测的ID-s(identity(1,1)目前不是我的解决方案(

与随机GUID发生冲突的概率为0。即使你发明了一个真正的100%无碰撞的ID,在实践中发生碰撞的概率也不会更低,因为你的ID生成器中出现错误或计算机硬件中出现故障的可能性与GUID碰撞的可能性一样大,因为宇宙射线会在你生成的ID中产生碰撞。

要估计GUID碰撞的概率,请将n设为数据库中的行数。随机GUID具有m = 122随机位,因此数据库中至少发生一次冲突的概率为

p(n) = 1 - (1-1/m)(1-2/m)...(1-(n-1)/m)
≈ n^2 / (2m)

假设CCD_ 4。在这种情况下

p(n) ≈ (10^9)^2 / (2 * 2^122)
≈ 9.4 x 10^-20

在72小时内发生RAM错误(即使有ECC(的概率也高得惊人!

所以答案是:GUID是在真实物理世界中的真实物理计算机上所能获得的最安全的碰撞。

在没有序列标识列的情况下保证唯一性的唯一方法是首先在表中查找ID,如果它已经存在,则生成一个新的ID。当然,这不是一个免费的操作,所以您需要权衡该检查的性能命中率与碰撞的(极小的(概率。您最好只尝试插入,如果发生冲突,请捕获错误并重试。

相关内容

最新更新