我们在数据库设计中广泛使用 GUID;业务对象属性为数据库空值提供 Guid.Empty
GUID,如果值为 Guid.Empty
,null
始终保存到数据库。
除了 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一点点:
- MAC 地址和时间戳。两者都可能很难哄骗到全 1 位。
- MAC 地址和时间戳以及用户 ID。与 v1 相同。
- MD5 散列。 可能甚至可以工作。
- PRNG。永远无法工作,因为第四部分的第一个数字总是或者
8
,9
,A
或B
.这与4
相矛盾版本号。 - 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
, 3
或 5
. 当然,不包括已经生成的 GUID。但是 MSB 设置为 0
的那些恰好是 v1 或 v2。其中的时间戳部分意味着它们必须在未来几千年内生成才能解决。
关于c# - 是否有可能在 .NET 中使用所有相同的字符生成 GUID? (例如 : {11111111-1111-1111-1111-111111111111}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155591/