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

Mar*_*man 27 c# guid

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

除了Guid.Empty(00000000-0000-0000-0000-000000000000)有多少可能使用所有相同的字符e生成GUID.G.:11111111-1111-1111-1111-111111111111

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

Joe*_*oey 70

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


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

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

让我们稍微剖析一下这些版本:

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

到目前为止,我们排除第4版是不可能的,其他人则不太可能.让我们来看看变体字段.

变量字段指定向后兼容某些位模式(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.
Run Code Online (Sandbox Code Playgroud)

由于此模式位于第四部分的开头,这意味着最高有效位始终设置为第四部分的第一个十六进制数字.这意味着,这个数字很可能永远不会1,2,35.当然,不计算已生成的GUID.但那些MSB的设置0恰好是v1或v2.而这些时间戳的一部分意味着它们将来必须产生一些千年才能实现.

  • 这是最正确的.例如,如果你使用System.Guid是不可能的,因为第13个"半字节"将始终为4而第17个将始终为8,9,A或B (3认同)

Dun*_*can 14

正好有5,316,911,983,139,663,491,615,228,241,121,400,000种可能的组合,所以即使它的设计并不总是独一无二,但无论如何都有可能相当遥远.

资料来源:http://msdn.microsoft.com/en-us/library/aa446557.aspx

  • "所以你说有机会?" - 电影报价,忍不住自己 (40认同)
  • -1 - 源声明存在许多GUID组合,但GUID不仅仅是随机数,因此与给定GUID的概率不同. (11认同)
  • 阿呆与阿瓜 (2认同)
  • 此外,有15个这样的GUID符合标准,而不仅仅是1,这是错误的!:-) (2认同)

Kev*_*vin 8

与任何其他随机生成的guid相撞的可能性大约相同.所以,极不可能.

但是,您可能想要重新考虑使用guid来"存储"这样的数据.它们实际上用于唯一标识对象和组件.


Rob*_*Rob 5

GUID通常是使用算法生成的,而不是真正随机的十六进制字符串。如果可以确定要使用哪种算法来生成它们,则可以确定要用作“幻数”的GUID是否会与生成的GUID相冲突。

GUID上的Wikipedia页面上包含有关所使用算法的大量信息,因此也许可以为您提供明确的答案。或者,在.net框架中的Guid.NewGuid()方法上运行Reflector,尽管它基于在OLE32中调用CoCreateGuid 的方法参考源


Fen*_*ton 5

你的问题已经得到解答,但我想我在这里应该务实一些。

1) 使用此约定,您只会给自己 8 个“硬编码”选项。

2)您可以为每个“特殊”情况创建一个真正的 GUID,而不是手动启动它们。这样,它就可以保证是唯一的,并且您将能够拥有超过 8 个。

我知道,这不是一个直接的答案,但考虑到您的意图,这可能是一个明智的建议。