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

blu*_*lds 8 c# asp.net-4.0

我希望生成唯一的ID来识别我的系统中的一些数据.我正在使用一个精心设计的系统,它将一些(非唯一的,相关的)元数据与System.Guid.NewGuid()连接起来.这种方法有什么缺点,还是我明白了?

Eri*_*ert 16

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

我建议使用GUID,因为它们按定义是全局唯一标识符.

我正在使用一个精心设计的系统,它将一些(非唯一的,相关的)元数据与System.Guid.NewGuid()连接起来.这种方法有什么缺点,还是我明白了?

好吧,因为我们不知道你认为什么是缺点,所以很难说.我想到了许多可能的缺点:

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

  • GUID不保证有任何特定的分布; GUID顺序生成是完全合法的,并且在124位空间上均匀分布是完全合法的(128位减去当然版本号的4位.)这会对数据库产生严重影响如果GUID被用作GUID索引到排序顺序的数据库上的主键,则性能; 如果新行始终在最后,插入效率会更高.统一分布的GUID几乎永远不会结束.

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

  • 等等.

我计划在接下来的几周内发布一系列关于GUID的这些和其他特征的文章; 观看我的博客了解详情.

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


Sou*_*eAK 7

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

虽然guid是如此复杂以至于几乎是独一无二的,但除了概率之外没有什么可以保证它不存在.这在统计上是不可思议的,在几乎任何情况下,它都是独一无二的.

生成相同的guids就像赢得两次彩票一样 - 实际上没有任何东西可以防止它,它实在是太不可能了.

大多数情况下,你可能不会检查现有的匹配,但在非常极端的情况下,有很多代正在进行,或者系统绝对不能失败,这可能值得检查.

编辑

让我澄清一点.你极不可能看到重复的guid.这才是重点.它是"全球唯一的",这意味着有一个无限可能的重复,你可以认为它是独一无二的.但是,如果我们谈论的是将飞机保持在天空,监视核反应堆或处理国际空间站生命支持的代码,我个人仍然会检查是否有重复,只是因为它真的很糟糕.打那个边缘的情况.另一方面,如果您只是编写博客引擎,请继续使用它,而无需检查.


Tig*_*ran 5

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

它产生相同guid两次的概率太低; 这里可以找到一个很好的例子:简单证明GUID不是唯一的

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

在某些时候它只是崩溃OutOfMemory不是重复的密钥冲突.

  • 这是一个糟糕的例子.`HashSet`在添加重复元素时不会抛出异常,它只是不添加它.这就是为什么它返回一个布尔值,指示是否添加了任何内容. (2认同)