我们在数据库设计中广泛使用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.
让我们稍微剖析一下这些版本:
8,9,A或B.这与4版本号相矛盾.到目前为止,我们排除第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,3或5.当然,不计算已生成的GUID.但那些MSB的设置0恰好是v1或v2.而这些时间戳的一部分意味着它们将来必须产生一些千年才能实现.
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
GUID通常是使用算法生成的,而不是真正随机的十六进制字符串。如果可以确定要使用哪种算法来生成它们,则可以确定要用作“幻数”的GUID是否会与生成的GUID相冲突。
GUID上的Wikipedia页面上包含有关所使用算法的大量信息,因此也许可以为您提供明确的答案。或者,在.net框架中的Guid.NewGuid()方法上运行Reflector,尽管它基于在OLE32中调用CoCreateGuid 的方法的参考源。
你的问题已经得到解答,但我想我在这里应该务实一些。
1) 使用此约定,您只会给自己 8 个“硬编码”选项。
2)您可以为每个“特殊”情况创建一个真正的 GUID,而不是手动启动它们。这样,它就可以保证是唯一的,并且您将能够拥有超过 8 个。
我知道,这不是一个直接的答案,但考虑到您的意图,这可能是一个明智的建议。