我希望生成唯一的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/
使用时System.Guid.NewGuid(),您可能仍希望检查系统中是否已存在guid.
虽然guid是如此复杂以至于几乎是独一无二的,但除了概率之外没有什么可以保证它不存在.这在统计上是不可思议的,在几乎任何情况下,它都是独一无二的.
生成相同的guids就像赢得两次彩票一样 - 实际上没有任何东西可以防止它,它实在是太不可能了.
大多数情况下,你可能不会检查现有的匹配,但在非常极端的情况下,有很多代正在进行,或者系统绝对不能失败,这可能值得检查.
编辑
让我澄清一点.你极不可能看到重复的guid.这才是重点.它是"全球唯一的",这意味着有一个无限可能的重复,你可以认为它是独一无二的.但是,如果我们谈论的是将飞机保持在天空,监视核反应堆或处理国际空间站生命支持的代码,我个人仍然会检查是否有重复,只是因为它真的很糟糕.打那个边缘的情况.另一方面,如果您只是编写博客引擎,请继续使用它,而无需检查.
随意使用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而不是重复的密钥冲突.