【问题标题】:How does C# generate GUIDs?C# 如何生成 GUID?
【发布时间】:2010-12-25 16:28:23
【问题描述】:

如何在 C# 中生成 GUID?

【问题讨论】:

  • 投票结束作为How are .NET 4 GUIDs generated? 的副本。我想这在原则上并不是一个完美的复制品(特别是因为现在存在 .NET Core,并且不清楚被骗的答案是否适用于非 Windows 操作系统上的 .NET Core),但目前这个问题没有答案这甚至接近于正确,而链接的欺骗确实如此。
  • 我同意这没有一个接近正确的答案。任何来这里获取实际有用信息的人请参阅stackoverflow.com/a/2757969/1739000
  • @MarkAmery 两者都不是重复的。这个问题比您引用的问题早 6 个月提出,而另一个问题是针对第 4 版的。How are .NET 4 GUIDs generated? 有可靠的答案,但真正应该考虑RFC 4122 以获得完整的图片。
  • @Chiramisu “这个问题是在 6 个月前提出的” - 正确,但不重要。将旧问题作为新问题的副本关闭是完全合法的。我们应该主要考虑在决定关闭方向时,搜索者最终会遇到哪个更有用的问题;年龄无关紧要。
  • @MarkAmery 虽然我认为您的回答是合理的,但我想进行适当的怀疑,并发现this answer 与您的观点一致,并且“帮助”部分中的文章也指向了相同的观点。在那张纸条上,我也会将其投票为骗子。 ;)

标签: c# .net winforms guid


【解决方案1】:

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

【讨论】:

  • 那篇文章讨论了几种不同的生成 GUID 的算法。 .NET 实际使用的是哪一个?
【解决方案2】:

原问题:

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

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

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

【讨论】:

  • 这个答案是错误的,因为它回答“什么是 GUID?”但真正的问题是“C# 如何生成 GUID?”。因此@Justin 提供的答案是正确的答案。
  • @OgnyanDimitrov - 由于英语不好,最初的问题非常含糊。听起来该请求与 GUID 的字符串表示有关。你可以看看这个问题的历史。考虑到所做的编辑以及该答案被提问者接受的事实,原始问题的含义已被更改,这是有争议的。我会将原始问题添加到我的答案中,以防有人带着这个问题来到这个页面。
  • 请不要被冒犯。我写这篇文章不是为了责备或嘲笑。您现在可以编辑您的答案,不是因为其他任何原因,而是为了提高答案的质量,即使问题一开始就含糊不清。从搜索结果中遇到的下一个人将得到更好的答案。我相信您经验丰富,知识渊博,我并不是要贬低您的回答。
【解决方案3】:

WikipediaMSDN 的详细信息。

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

【讨论】:

  • -1;根据您链接到的维基百科文章,有 5 种不同的标准化 UUID 生成算法。 “查看链接的 Wikipedia 文章” 因此没有回答 C# 尤其是 如何生成 UUID 的问题。
【解决方案4】:

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

Guid g = new Guid.NewGuid(); 指导 g = Guid.NewGuid(); /* 谢谢戴夫! */

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

它更常用于互斥体,例如创建应用程序的单个实例,并通过使用带有 guid 的互斥体来保证应用程序实例的生命周期。

甚至,在某些情况下,它在数据库中使用,但使用它的方法却令人不悦。

【讨论】:

  • 不能保证 GUID 是唯一的,只是不太可能生成两个相同的。
  • 如果使用 Guid.NewGuid(),则不需要(实际上,不能使用)new 关键字
【解决方案5】:

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

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

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

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

【讨论】:

  • 关于 C# 中 GUID 生成的问题,这个答案与此无关; -1.
【解决方案6】:

a really good article on Raymond Chen's blog 描述了 GUID 的生成方式,特别是为什么不能保证 guid 的子字符串是唯一的。

基本上,GUID 是使用以下组合生成的:

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

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

【讨论】:

  • .NET 使用 Windows 算法从 Windows 2000 开始创建一个随机数(版本 4 GUID):stackoverflow.com/a/2757969/1059776
  • -1;这个答案基本上用最后一句末尾的链接破坏了它的整个前提,并承认不是所问问题的答案。
【解决方案7】:

GUID 的位分解如下:

  • 60 位时间戳
  • 48 位计算机标识符
  • 14 位唯一性
  • 6 位是固定的

总共 128 位。

【讨论】:

  • -1;如stackoverflow.com/a/2757969/1709587 中所述,此答案不适用于在 Windows 上使用 C# 的 Guid.NewGuid 生成的 GUID。事实上,所有语言/操作系统/框架都有很好的隐私理由来避免您在此处描述的 GUID 生成算法(或者至少不将其用作默认算法),正如罪犯 David L. Smith could explain to you
【解决方案8】:

这取决于。对于 Unix GUID 中的 .NET Core,通过创建一个 128 位的随机数并执行几个位操作来生成。在 .NET Core for Windows 和 .NET 框架中,它对 Windows 函数 UuidCreate 进行远程过程调用(因此它们的生成方式完全取决于您的 Windows 版本)。对于 Unix 和最新版本的 Windows,您会注意到有一个十六进制数字始终是 4。那是因为它是 Uuid 4 的版本号,这意味着它们是用随机字节生成的。 GUID 过去是使用时间戳和 MAC 地址等信息生成的,但这成为了一种攻击媒介,因为它告诉最终用户有关系统的信息并帮助他们更轻松地预测未来的 GUID。

【讨论】:

  • 这是我一整天找到的最佳答案之一。
猜你喜欢
  • 2019-09-24
  • 2014-12-21
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多