Guid.NewGuid() 与 new Guid()的区别

405

Guid.NewGuid()new Guid()有什么区别?

哪一个更受推荐?


6
@ClintonWard 我对C#几乎是新手,@Bob2Chiv 我现在无法运行这个项目,但很好奇它是怎样的。 - OscarRyz
7
我使用LinqPad来快速测试C#代码。 - DaveShaw
5
我相信这个问题是相关的,因为它很令人困惑,我并不认为"0000000-0000.."是最好的默认值。 我刚遇到一个问题,客户无法登录系统,因为在项目的深处调用了new Guid()而不是NewGuid()。 - Michiel Cornille
3
@DaveShaw - LinQPad很棒,我经常使用它。但是我想指出的是,Visual Studio现在有一个"C# Interactive"窗口,非常适合这种测试。 - Mark Meuer
还有http://csharppad.com/,当你没有VS.Net方便时可以使用... - T.J. Crowder
1
@MichielCornille 刚刚体会到了那种感觉,兄弟... - Jins Peter
5个回答

678

new Guid() 创建一个“空”全零 GUID(00000000-0000-0000-0000-000000000000 并不是很有用)。

Guid.NewGuid() 创建一个具有唯一值的实际 GUID,这可能是您想要的。


33
一个空的UUID确实非常有用。它可以作为一个很好的特殊值使用。 - Jon Hanna
125
顺便提一句,new Guid() 相当于 Guid.Empty - Steve Guidi
36
所有GUID都可以成为很好的特殊值。不幸的是,空GUID有相撞的倾向。尽管如此,我认为空GUID很有用,通常用于指示某些东西未初始化。 - MarkPflug
7
空值非常有用,因为它们可以发生碰撞。一个与已知特殊值不发生碰撞的特殊值将是无用的。 - Jon Hanna
7
我认为你们两个都认同它可以作为一个好的“已知GUID”进行比较,例如在指示某些正在等待初始化或处于其他已知状态的情况下。个人而言,我更喜欢使用空值,但我可以理解有人可能需要一个“特殊”的GUID,而全0的GUID可能是最不容易违反代码未来维护者“最少惊讶原则”的GUID。 - PeterL
显示剩余5条评论

47

Guid.NewGuid() 使用一个设计良好的算法创建新的UUID,以使碰撞的可能性非常小。

new Guid() 创建全零UUID。

通常情况下,您应该选择前者,因为这是UUID的目的(除非您当然从其他地方接收到它)。

有些情况下,确实需要一个全零的UUID,但在这种情况下,Guid.Emptydefault(Guid) 更清晰地表达了您的意图,并且人们读取时不会期望已创建一个唯一值。

总的来说,由于缺乏明确性,new Guid() 并不是很有用,但无法拥有没有参数的构造函数返回全零和空值的值类型。

编辑:实际上,在值类型上拥有不设置所有值为零和空的无参数构造函数是可能的,但您无法在C#中实现,而什么时候将调用它以及何时将仅创建全零结构的规则很困惑,因此这也不是一个好主意。


18
我会尽力进行翻译,请问以下是需要的内容吗?为了增加一些趣味性,我会补充这个。如果要获得1%的碰撞概率,则需要生成约2,600,000,000,000,000,000个全局唯一标识符(GUID)。 - Clinton Ward
10
这取决于使用的UUID算法,但由于一些算法使用MAC地址以避免机器之间的冲突,并且所有算法都使用时间因素以避免同一台机器上的冲突,因此你需要创建比正常数学建议的更多。 除非你故意改变时间并搞乱MAC地址来干扰算法,否则你应该很快就能获取一个 - 但这是在故意干扰输入。 - Jon Hanna
3
那是版本1的GUID。更新的微软GUID是版本4,不使用MAC地址来生成GUID。尽管如此,时间仍然是一个因素。 - Clinton Ward

17

[我理解这是一个旧帖子,只是添加一些更多细节] Mark和Jon Hanna的两个答案概括了区别,但也许有些人会感兴趣的是

Guid.NewGuid()

最终调用CoCreateGuid(一个COM调用到Ole32)(参考这里),实际的工作由UuidCreate完成。

Guid.Empty用于检查Guid是否包含了所有的零。这也可以通过比较相应的Guid值与new Guid()来完成。

所以,如果你需要一个唯一标识符,答案就是Guid.NewGuid()


这里是在Windows上实现Guid.NewGuid()的代码:https://github.com/dotnet/corert/blob/master/src/System.Private.CoreLib/shared/System/Guid.Windows.cs - Tyr

0

Guid.NewGuid() 初始化一个新的 Guid 结构实例。

示例:

Guid g = Guid.NewGuid();
Console.WriteLine(g);

// This code example produces a result similar to the following:

// 0f8fad5b-d9cb-469f-a165-70867728950e

该方法创建一个版本4的通用唯一标识符(UUID),如RFC 4122,第4.4节所述。

正如官方文档中提到的那样,

返回的Guid保证不等于Guid.Empty。


-1

Guid.NewGuid() 可以创建 GUIDs。

Guid.NewGuid() 创建一个空的 Guid 对象,通过调用 CoCreateGuid 进行初始化并返回该对象。

new Guid() 仅仅创建一个空的 GUID(所有位都是零,我想)。

我猜他们必须将构造函数设置为公共的,因为 Guid 是一个 struct


12
为什么要添加一个答案,而这个答案并没有提供任何在这里已经存在多年的其他答案所没有的信息? - Dinerdo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接