C#如何生成GUID?

时间:2009-12-11 14:00:49

标签: c# .net winforms guid

如何在C#中生成GUID?

8 个答案:

答案 0 :(得分:44)

有一篇非常好的文章here描述了如何生成GUID,特别是为什么guid的子字符串不被保证是唯一的。

基本上使用

的组合生成GUID
  • 用于生成GUID的计算机的MAC地址(因此,除非重新使用MAC地址,否则在不同计算机上生成的GUID是唯一的)
  • 时间戳(因此在同一台计算机上的不同时间生成的GUID是唯一的)
  • 额外的“紧急统一程序位”(这些用于确保在同一台计算机上几乎完全同时生成的GUID是唯一的)
  • 算法的标识符(以便使用其他算法生成的GUID是唯一的)

然而,这只是一个用于生成GUID 的特定算法(虽然我相信它是.Net框架使用的那个),而不是the one used by the .Net framework

答案 1 :(得分:13)

此算法在此处记录为Globally unique identifier

答案 2 :(得分:10)

原始问题:

  

Guid如何生成它的标识符?它将如何输出   如果我使用以下代码Guid g = Guid.NewGuid();

     

输出是否是数字和字母组合或   只有数字会在那里???

<。> .Net System.Guid只是一个128位整数(16个字节)。数字和字母与它无关。您可以使用ToString()方法查看Guid的各种“人类可读”版本,其中包括数字0-9和字母AF(表示十六进制值),但这完全取决于您希望如何输出它。 / p>

答案 3 :(得分:1)

除了“随机16字节”之外,还有其他形式的GUID,如RFC中所述。某些Microsoft产品(例如SQL Server)可以选择性地生成这些“顺序GUID”,它们基于“系统中第一个网卡的MAC地址+基于系统时间的不断增加的计数器”的组合。

当用作具有聚簇索引的数据库主键时,这些“顺序GUID”具有始终将新记录附加到数据库表的“结尾”的良好属性。这有助于防止数据库索引碎片和页面拆分。

如果随机GUID用作具有聚簇索引的数据库主键,则新记录将从物理分配的角度随机插入表的“中间”,这会导致索引碎片和部分完整的数据库页面随着时间的推移。

使用顺序GUID仍允许您在多个系统上独立生成GUID,并确信不会发生任何冲突(使用顺序整数作为主键而不分配“范围”或不同种子和增量的属性每个系统,这是大型分布式应用程序中的管理噩梦。)

答案 4 :(得分:0)

有关WikipediaMSDN的详情。

简而言之,GUID是一个随机的128位整数,但我们使用十六进制数字对它们进行格式化,以便它们易于阅读(这是您看到的8-4-4-4-12格式)。至于它的生成方式,请参阅链接的维基百科文章。

答案 5 :(得分:0)

GUID的位分解如下:

  • 60位时间戳
  • 48位计算机标识符
  • 14位uniquifier
  • 固定6位

总共128位。

答案 6 :(得分:0)

这取决于。对于Unix GUID中的.NET Core,可通过创建随机数的128位并执行几位逐位操作来生成。在Windows的.NET Core和.NET框架中,它对Windows函数UuidCreate进行远程过程调用(因此,如何生成它们完全取决于Windows版本)。对于Unix和Windows的最新版本,您会注意到有一个十六进制数字始终为4。这是因为它是Uuid 4的版本号,仅表示它们是用随机字节生成的。 GUID以前是用时间戳和MAC地址之类的东西生成的,但是由于它告诉最终用户有关系统的信息,并帮助他们更容易地预测将来的GUID,因此成为攻击媒介。

答案 7 :(得分:-1)

Guid是一个唯一的数字,有数十亿个排列,由十六进制和数字组合组成。它是根据不同因素生成的,如时间,Windows版本,系统资源,如硬盘,主板,设备等。 保证Guid是唯一的。(谢谢ck!)我还没有看到你做过的实例

Guid g = new Guid.NewGuid();
Guid g = Guid.NewGuid(); /* Thanks Dave! */

其中g在连续运行中具有相同的值。

它更常用于互斥锁,一个例子是创建应用程序的单个实例,并使用带有guid的互斥锁来保证应用程序实例的生命周期。

甚至,在某些情况下,它在数据库中使用,但使用它的方法却不受欢迎。