在查找数据的唯一 ID 时依赖 System.Guid.NewGuid() 函数是否有任何缺点

本文关键字:NewGuid 函数 是否 缺点 任何 Guid System 数据 查找 唯一 ID | 更新日期: 2023-09-27 18:31:38

我希望生成唯一的id来识别系统中的一些数据。我正在使用一个复杂的系统,它将一些(非唯一,相关的)元数据与System.Guid.NewGuid()连接起来。这种方法有什么缺点吗,或者我很清楚吗?

在查找数据的唯一 ID 时依赖 System.Guid.NewGuid() 函数是否有任何缺点

我希望生成唯一 ID 来识别系统中的某些数据。

然后,我建议使用 GUID,因为根据定义,它们是全局唯一标识符

我正在使用一个复杂的系统,它将一些(非唯一,相关的)元数据与System.Guid.NewGuid()连接起来。这种方法有什么缺点吗,或者我很清楚吗?

好吧,由于我们不知道您会认为缺点是什么,因此很难说。我想到了许多可能的缺点:

  • GUID 很大:128 位是很多位。

  • GUID 不保证具有任何特定的分布;按顺序生成 GUID 是完全合法的,在其 124 位空间(128 位减去版本号的四个位)上均匀分布是完全合法的。 如果 GUID 用作由 GUID 按排序顺序编制索引的数据库的主键,这可能会对数据库性能产生严重影响;如果新行总是放在末尾,则插入效率要高得多。均匀分布的 GUID 几乎永远不会排在最后。

  • 版本 4 GUID 不一定是加密随机的;如果 GUID 是由非加密随机生成器生成的,则攻击者理论上可以在给定 GUID 的代表性样本时预测 GUID 是什么。理论上,攻击者可以确定在同一会话中生成两个 GUID 的概率。当然,版本 1 GUID 几乎完全不是随机的,并且可以告诉复杂的读者它们是在何时何地生成的。

  • 等等。

我计划在接下来的几周内撰写一系列关于 GUID 的这些和其他特征的文章;有关详细信息,请观看我的博客。

更新:https://ericlippert.com/2012/04/24/guid-guide-part-one/

使用 System.Guid.NewGuid() 时,您可能仍希望检查系统中是否尚不存在 guid。

虽然 GUID 非常复杂,几乎是唯一的,但除了概率之外,没有什么可以保证它不存在。这在统计上不太可能,以至于几乎在任何情况下它都与唯一性相同。

生成相同的指导就像中了两次彩票 - 没有什么可以真正阻止它,只是不太可能,也可能是不可能的。

大多数时候,您可能会不检查现有匹配项,但是在非常极端的情况下,有很多生成正在进行,或者系统绝对不能失败,可能值得检查。

编辑

让我再澄清一点。您极不可能看到重复的 GUID。这就是重点。它是"全局唯一的",这意味着重复的可能性非常小,你可以假设它是独一无二的。但是,如果我们谈论的是使飞机保持在天空中,监视核反应堆或处理国际空间站上的生命支持的代码,我个人仍然会检查重复项,只是因为遇到这种边缘情况真的很糟糕。另一方面,如果您只是在编写博客引擎,请继续使用它而无需检查。

随意使用 NewGuid() .它的独特性没有问题。

它生成两次相同 guid 的可能性太低;可以在此处找到一个很好的例子:GUID 不是唯一的简单证明

var bigHeapOGuids = new Dictionary<Guid, Guid>();
try
{
   do
   {
      Guid guid = Guid.NewGuid();
      bigHeapOGuids.Add(guid ,guid );
   } while (true);
}
catch (OutOfMemoryException)
{
}

在某些时候,它只是在OutOfMemory上崩溃,而不是在重复的密钥冲突上崩溃。