【问题标题】:Guid.NewGuid() vs. new Guid()Guid.NewGuid() 与新 Guid()
【发布时间】:2012-08-09 21:49:38
【问题描述】:

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

哪个更受欢迎?

【问题讨论】:

  • @ClintonWard 我几乎是 C# 新手,@Bob2Chiv 我现在无法运行该项目,对此很好奇。
  • @OscarRyz - 为了在 C# 中快速测试代码,我使用 LinqPad
  • 实际上我相信这个问题是相关的,因为它令人困惑,我并没有真正将“0000000-0000..”作为最佳默认值。我刚刚遇到了一个客户端无法登录系统的问题,因为在项目深处的某个地方调用了 new Guid() 而不是 NewGuid()
  • @DaveShaw - LinQPad 很棒,我经常使用它。但我想指出的是,Visual Studio 现在有一个“C# Interactive”窗口,对于这类测试非常有用。
  • @MichielCornille 刚刚了解了兄弟的感觉......

标签: c# guid


【解决方案1】:

new Guid() 生成一个“空”的全 0 guid(00000000-0000-0000-0000-000000000000 不是很有用)。

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

【讨论】:

  • 一个空的 UUID 确实非常有用。它具有很大的特殊价值。
  • 附带说明,new Guid() 等同于 Guid.Empty
  • @JonHanna 所有的 guid 都有很大的特殊价值。不幸的是,空的有碰撞的倾向。不过,我同意空 guid 很有用,通常表示某些内容未初始化。
  • 空的非常有用,因为它们确实会发生碰撞。与已知特殊值不冲突的特殊值将毫无用处。
  • 我认为你们都同意它是一个很好的“已知 guid”来比较,例如指示某物正在等待初始化或处于其他已知状态。就我个人而言,我更喜欢使用空值,但我可以看到有人可能在某些时候需要一个“特殊”的 guid,而全 0 的 guid 可能是最不可能违反未来维护者最不意外原则的 guid的代码。
【解决方案2】:

Guid.NewGuid() 使用一种算法创建一个新的 UUID,该算法旨在使冲突非常、非常不可能发生。

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

通常您更喜欢前者,因为这是 UUID 的意义所在(当然,除非您是从其他地方接收它)。

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

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

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

【讨论】:

  • 我会为了好玩而添加这个。对于 1% 的碰撞几率,您需要生成大约 2,600,000,000,000,000,000 个 GUID
  • @ClintonWard 这取决于使用哪种 UUID 算法,但由于有些使用 MAC 地址来避免机器之间的冲突,并且都使用时间因子来避免同一台机器上的冲突,因此您需要创造比正常数学所建议的更多的东西。除非你故意通过改变时间和弄乱 MAC 地址来搞砸算法,在这种情况下你应该很快得到一个 - 但这是故意弄乱输入。
  • 那是 v1 Guid。较新的 MS GUID 是 V4,并且不使用 MAC 地址作为 GUID 生成的一部分。时间仍然是一个因素
【解决方案3】:

[我知道这是一个旧线程,只是添加更多细节] Mark 和 Jon Hanna 的两个答案总结了这些差异,尽管有些人可能会感兴趣

Guid.NewGuid()

最终调用 CoCreateGuid(对 Ole32 的 COM 调用)(参考 here),实际工作由 UuidCreate 完成。

Guid.Empty 用于检查 Guid 是否包含全零。这也可以通过将相关 Guid 的值与 new Guid()

进行比较来完成

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

【讨论】:

    【解决方案4】:

    Guid.NewGuid(),因为它会按预期创建 GUID。

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

    new Guid() 只是创建一个空的 GUID(我认为全为零)。

    我猜他们必须公开构造函数,因为 Guidstruct

    【讨论】:

    • 添加一个不添加任何已存在多年的答案中不存在的任何内容的答案有什么意义?
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2010-11-22
    • 1970-01-01
    • 2023-02-10
    • 2021-10-24
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多