甚至值得检查一下Guid.NewGuid()是否为Guid.Empty吗?


28

在其中一个项目中,我经常遵循以下模式进行工作:

var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
    guid = Guid.NewGuid().ToString();
}

虽然我知道不能保证 GUID是唯一的,并且根据MSDN文档,生成的GUID可能为零,但这是否是一个实际的考虑因素,实际上值得在计算意义上以及针对开发人员的角度进行周期测试?


1
如果您反复看到此模式,也许可以使用实用程序方法?与正在检查永远不会发生的边缘情况(即使确实发生这种情况并不重要)相比,重复这样的代码块似乎是一个更大的问题。
psr 2015年

27
那里的代码可以阻止鳄鱼。有鳄鱼在哪里写代码?没有?然后显然可以了!
埃里克·利珀特

3
无论如何,我都会在一段时间内执行此操作。
Arturo TorresSánchez2015年

3
到底为什么要把GUID转换成字符串然后进行比较?他们自己比较好。
安迪

2
文档已被更新:“返回的GUID是保证不等于Guid.Empty。”
sschoof

Answers:


33

我认为不值得检查Guid.Empty。Guid.NewGuid的文档出于某种原因提到

新Guid的值全为零或等于任何其他Guid的机会非常低。

Guid.NewGuid是Win32 API CoCreateGuid的包装,它没有提到返回所有零。

Raymond Chen 走得更远,建议

没有有效的CoCreateGuid实现可以生成GUID_NULL

所以,不,我不会担心。我不会猜测Guid.NewGuid文档为什么会提到它。


1
“并且即使由于某种原因确实生成了GUID_NULL,唯一性也要求它仅生成一次!(因此,您应该尝试强制此bug在测试中发生,然后您可以确信它永远不会在生产中发生。 )”-不错!
razethestray 2015年

3
@razethestray-您可以在我的赌场下注所有您想要的。
JeffO

10
@JeffO对你开玩笑,他确保自己在家旋转37次,并将把所有的钱都投入到没有出现的那笔钱上。
Random832

在xamarin上,Guid.NewGuid有时会失败并不断返回空(当guid在ef内核中自动分配时)无法弄清楚原因
Karan Harsh Wardhan

@KaranHarshWardhan我希望您将其报告为错误。:)
Curt Nichols

43

如果您发现Guid.NewGuid() == Guid.Empty自己赢得了地球上最艰难的彩票。不要打扰任何唯一性或冲突检查。不必做什么的GUID 。我会为您节省数学的时间,它在网络上无处不在。

此外,Windows guid始终具有一个等于的“数字” 4。有一些指导结构。

您发布的代码片段看起来像一个开发人员忘记了初始化Guid变量而发现它是Guid.Empty。他错误地确定Guid.NewGuid()了原因。现在,他将永远迷信这一点。

无论如何,这是一个错误的问题。我确信您的代码不仅不依赖于绘图,Guid.Empty而且还依赖于唯一性。该while循环不会强制唯一性。指导在没有协调的情况下产生独特的价值。那就是他们的用例。


5
+1以“提出错误的问题”。这与唯一性有关,这才是真正重要的。
托马斯·斯金格

1
@rjzii考虑将其设为接受的答案!
emcor

18

查看method源代码Guid.NewGuid

public static Guid NewGuid() {
    Contract.Ensures(Contract.Result<Guid>() != Guid.Empty);
    ...
}

看到代码合同了吗?该Guid.NewGuid方法永远不会提供空的GUID。


2
不知道为什么收到拒绝票,因为它提到其他答案中缺少的内容。代码合同的存在是一个很好的保证,并且也为原始问题提供了一个很好的答案。+1为查看实际实现的想法。
Arseni Mourzenko 2015年

我喜欢代码合同。
安迪

10

如果要针对零GUID检查GUID,则根据相同的逻辑,您还需要进行尽职调查,以针对应用程序中的所有其他GUID进行检查(因为获得零的概率应与针对GUID的概率相同)。在您的应用中获取其他GUID *)。您需要执行此操作以证明您所作用的公理是该GUID是唯一的(实际上与test相对于0是相同的公理)。

显然,这样做是荒谬的。

TLDR;如果您可以信任NewGuid()来产生唯一的结果,则也可以信任它不产生任何已知的GUID。

*实际上与.NET GUID总是不同的概率不相同,{________-____-4___-____-____________}因此NewGuid永远不会生成零GUID

只是为了好玩,我建议对此处的文档进行改进:http : //feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid


3
为什么.NET GUID总是包含4?
Arturo TorresSánchez2015年

9
@ArturoTorresSánchez:有关您的问题的答案以及有关GUID的更多有趣事实,请参阅从此处开始的我的系列文章。ericlippert.com/2012/04/24/guid-guide-part-one 为方便起见,我注意到卢克已经链接到第三部分。答案很简单:第4版的GUID始终包括4
埃里克利珀

@EricLippert这是一篇非常好的文章:)
不被爱不是他们的人
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.