c# - 是否有可能在 .NET 中使用所有相同的字符生成 GUID? (例如 : {11111111-1111-1111-1111-111111111111})

标签 c# guid

我们在数据库设计中广泛使用 GUID;业务对象属性为数据库空值提供 Guid.Empty GUID,如果值为 Guid.Emptynull 始终保存到数据库。

除了 Guid.Empty (00000000-0000-0000-0000-000000000000) 之外,使用所有相同字符 e 生成 GUID 的可能性有多大?例如:11111111-1111-1111-1111-111111111111

只是考虑将这些 GUID 用于特定值。

最佳答案

简而言之:对于根据已发布的标准和规范生成的 GUID,它不可能发生。 GUID 具有结构,并且某些字段实际上具有含义。更重要的是,.NET 生成版本 4 的 GUID,这是绝对不可能发生的。它们的定义方式不会有这样的 GUID。有关详细信息,请参见下文 ;-)


有五到七个位是这里的主要陷阱。这些是版本标识符(第三部分的前四位)和变体字段,指定这是什么 GUID 变体。

当前版本可以是 1 到 5 之间的任何值。因此,此时我们可以获得此类 GUID 的唯一有效十六进制数字显然是 1 到 5。

让我们剖析 versions一点点:

  1. MAC 地址和时间戳。两者都可能很难哄骗到全 1 位。
  2. MAC 地址和时间戳以及用户 ID。与 v1 相同。
  3. MD5 散列。 可能甚至可以工作。
  4. PRNG。永远无法工作,因为第四部分的第一个数字总是或者8 , 9 , AB .这与 4 相矛盾版本号。
  5. SHA-1 哈希。 可能甚至可以工作。

到目前为止,我们排除了版本 4 的可能性,其他版本的可能性极小。让我们看一下变体字段。

variant field为向后兼容指定一些位模式(x 是一个不关心),即:

0 x x Reserved. NCS backward compatibility.
1 0 x The only pattern that currently can appear
1 1 0 Reserved, Microsoft Corporation backward compatibility
1 1 1 Reserved for future definition.

由于此模式位于第四部分的最开始,这意味着最高有效位始终设置为第四部分的第一个十六进制数字。这意味着这个数字 永远不可能是 1 , 2 , 35 . 当然,不包括已经生成的 GUID。但是 MSB 设置为 0 的那些恰好是 v1 或 v2。其中的时间戳部分意味着它们必须在未来几千年内生成才能解决。

关于c# - 是否有可能在 .NET 中使用所有相同的字符生成 GUID? (例如 : {11111111-1111-1111-1111-111111111111}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155591/

相关文章:

c# - 在每个类中调用相同方法的最佳方法是什么?

sql-server-2008 - 使用 SQL 存储过程将我的 GUID 选择到变量中?

php - 我应该如何创建我的 GUID?

c# - 是否可以创建相同的 guid

C# Sqlite 使用 DataTable 抛出 ConstraintException

c# - 从旧字典填充新字典

c# - ASP.NET 网络 API : Perform Search on Table using HTTP GET Method and Linq to SQL Dynamically

c# - HttpUtility.ParseQueryString 的可移植类库 (PCL) 版本

c# - 如何获得不依赖于操作系统的唯一机器 GUID?

c# - 如何创建不包含数字的唯一标识符?