是否有任何缺点来寻找数据唯一ID时依靠System.Guid.NewGuid()函数?

问题描述 投票:8回答:3

我期待生成唯一的ID在我的系统识别一些数据。我使用的串接一些(非唯一相关的)元数据与System.Guid.NewGuid一个复杂的系统()秒。是否有任何缺点这种方法,还是我在清楚了吗?

c# asp.net-4.0
3个回答
16
投票

我期待生成唯一的ID在我的系统识别一些数据。

我建议一个GUID然后,因为它们是通过定义全局唯一标识符。

我使用的是一个复杂的系统,它与System.Guid.NewGuid串接一些(非唯一相关的)元数据()。是否有任何缺点这种方法,还是我在清楚了吗?

那么,既然我们不知道你会考虑一个缺点,这是很难说的。一些可能的弊端浮现在脑海中:

  • GUID是大:128位是很多位。
  • 的GUID不能保证有任何特殊的分布;它是完全合法为要被顺序生成的GUID,它是完全合法的要在其124位的空间均匀地分布(128位减去的四个比特是当然的版本号)。这可以对数据库的严重影响性能,如果正在使用的GUID作为被索引到由GUID排序顺序的数据库上的主键;插入是更有效的,如果新行总是在去年底。均匀分布的GUID将几乎从来没有在年底。
  • 第4点的GUID不一定加密随机的;如果GUID的是通过非加密随机发生器产生,攻击者在理论上可以预测你的GUID是什么给了他们的代表性样本时。攻击者可以在理论上确定在同一个会话中生成的两个GUID的概率。版本一个GUID是当然勉强随机可言,并且可以告诉读者精良何时何地产生他们。
  • 等等。

我策划了一系列关于这些,并在接下来的几个星期的GUID等特点物品;看我的博客的详细信息。

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


7
投票

当您使用System.Guid.NewGuid(),你可能还是要检查GUID不已经在你的系统中存在。

虽然GUID是太复杂,是几乎是独一无二的,没有什么可以保证它不只是概率存在。这只是令人难以置信的统计学可能性不大,到是,在几乎所有情况下,它一样是唯一的地步。

生成到相同的GUID就像是买彩票中奖的两倍 - 没有什么实际阻止它,它只是这么不大可能它也可能是不可能的。

大多数时候,你很可能逃脱不检查现有的匹配,但有很多代的事情,或在系统绝对不能失败一个非常极端的情况下,它可能是值得一试。

编辑

让我澄清一下多一点。这是非常,非常不可能的,你会看到过一个重复的GUID。这才是重点。这是“全球唯一的”,意思是有,你可以认为它是唯一一个重复这样一个无限的机会。但是,如果我们谈论的是保持飞机在天空中的代码,监控核反应堆,或在国际空间站处理生活配套,我个人仍然会检查是否有重复的,只是因为它真的是可怕的打的边缘情况。如果你只是写一个博客引擎,而另一方面,勇往直前,用它不检查。


5
投票

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

有太低的概率将产生相同的GUID两次;一个很好的例子可以在这里找到:Simple proof that GUID is not unique

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

在某些时候,它只是坠毁,机上OutOfMemory而不是重复键冲突。

© www.soinside.com 2019 - 2024. All rights reserved.