Guid.NewGuid()与新Guid()

Osc*_*Ryz 327 c# guid

Guid.NewGuid()和之间有什么区别new Guid()

哪一个更受欢迎?

Mar*_*lug 546

new Guid() 使一个"空"全0-guid(00000000-0000-0000-0000-000000000000不是很有用).

Guid.NewGuid() 制作一个具有独特价值的实际guid,你可能想要的.

  • 另外,`new Guid()`相当于`Guid.Empty`. (98认同)
  • @JonHanna所有的guids都有很大的特殊价值.不幸的是,空的那些倾向于碰撞.我同意空guid是有用的,通常是为了表明某些东西是未初始化的. (29认同)
  • 空的UUID确实非常有用.它具有很大的特殊价值. (26认同)
  • 空的非常有用,因为它们碰撞了.不与已知特殊值发生冲突的特殊值将是无用的. (5认同)
  • 我认为你们都同意它是一个很好的"已知指南"来比较,就像在指示某些东西正在等待初始化或处于某种其他已知状态的情况一样.我个人更喜欢使用空值,但我可以看到有人可能需要一个"特殊"的指导,并且全0指导可能是最不可能违反未来维护人员最少意外的原因的指导的代码. (5认同)
  • @Steve Guidi - 和默认(Guid) (2认同)
  • @SteveGuidi 从某种意义上说,“default(Guid)”(或其 C# 1.0 等效的“new Guid()”)比“Guid.Empty”更好,因为它是一个编译时常量。例如,方法 `static void M(Guid optionalUuid = Guid.Empty) { /* ... */ }` 将无法编译。如果您使用“default(Guid)”(或相同的“new Guid()”),它就可以工作(可选参数)。 (2认同)

Jon*_*nna 37

Guid.NewGuid() 使用旨在使冲突非常非常不可能的算法创建新的UUID.

new Guid() 创建一个全零的UUID.

一般来说,你更喜欢前者,因为这是UUID的重点(除非你当然是从其他地方接收它).

在某些情况下,您确实需要全零UUID,但在这种情况下Guid.Emptydefault(Guid)更清楚您的意图,并且有人读取它的可能性较小,期望创建一个唯一值.

总而言之,new Guid()由于缺乏清晰度而没有那么有用,但是不可能有一个没有无参数构造函数的值类型返回一个全零和空值.

编辑:实际上,有可能在值类型上有一个无参数构造函数,它不会将所有内容设置为零和null,但是你不能在C#中执行它,以及关于何时调用它以及何时将调用它的规则只是创建一个全零结构是令人困惑的,所以无论如何它都不是一个好主意.

  • 我会添加这个以获得乐趣.对于1%的碰撞机会,您需要生成大约2,600,000,000,000,000,000个GUID (16认同)
  • @ClintonWard它取决于哪个UUID算法正在使用,但由于有些人使用MAC地址来避免机器之间的冲突,并且都使用时间因素来避免在同一台机器上发生冲突,因此您需要创建比正常数学更多的算法会建议.除非你故意通过改变时间和搞乱MAC地址来搞砸算法,在这种情况下你应该很快得到一个 - 但这是故意弄乱输入. (8认同)
  • 那是v1 Guid.较新的MS GUID是V4,不使用MAC地址作为GUID生成的一部分.时间仍然是一个因素 (2认同)

Sud*_*hra 16

[我明白这是一个老线程,只是添加更多细节] Mark和Jon Hanna的两个答案总结了差异,尽管它可能会引起一些人的兴趣.

Guid.NewGuid()
Run Code Online (Sandbox Code Playgroud)

最后调用CoCreateGuid(对Ole32的COM调用)(这里引用),实际工作由UuidCreate完成.

Guid.Empty用于检查Guid是否包含全零.这也可以通过将有问题的Guid的值与新的Guid()进行比较来完成

因此,如果您需要唯一标识符,答案是Guid.NewGuid()