Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中生成的GUID是否可能具有所有相同的字符?(e. ;g.:{11111111-1111-1111-1111-1111-111111})_C#_Guid - Fatal编程技术网

C# 在.NET中生成的GUID是否可能具有所有相同的字符?(e. ;g.:{11111111-1111-1111-1111-1111-111111})

C# 在.NET中生成的GUID是否可能具有所有相同的字符?(e. ;g.:{11111111-1111-1111-1111-1111-111111}),c#,guid,C#,Guid,我们在数据库设计中广泛使用guid;业务对象属性为DB null值提供Guid.EmptyGuid,如果值为Guid.Empty,则null始终保存到数据库中 除了Guid.Empty(00000000-0000-0000-0000-000000000000)生成具有所有相同字符的Guid的可能性有多大,例如:11111111111-1111-1111-1111-111111111111 只要考虑将这些guid用于特定的值。与任何其他随机生成的guid发生冲突的可能性差不多。所以,可能性很小 不

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

除了
Guid.Empty
00000000-0000-0000-0000-000000000000
)生成具有所有相同字符的Guid的可能性有多大,例如:
11111111111-1111-1111-1111-111111111111


只要考虑将这些guid用于特定的值。

与任何其他随机生成的guid发生冲突的可能性差不多。所以,可能性很小


不过,您可能需要重新考虑使用guid来“存储”这样的数据。它们实际上用于唯一地标识对象和组件

非常非常低。GUID格式包含一些标识方案的位。如果您自己“生成”它们,GUID方案很可能是错误的

有5316911983139663491615222824112400000种可能的组合,因此,即使它不是设计为总是独一无二的,机会也非常渺茫


来源:

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


有相当数量的关于所使用的算法的信息,因此可以给您一个明确的答案。或者,在.net framework中的Guid.NewGuid()方法上运行Reflector,尽管是基于查看this调用。

为什么要使用专门设计的Guid?除了可识别的方面之外,为什么不使用正确生成的GUID呢?(你知道这将是唯一的,这就是重点)

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


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

当前版本可以是1到5之间的任何内容。因此,在这一点上,我们可以得到这样一个GUID的唯一有效十六进制数字是–显然–1到5

让我们稍微剖析一下这个问题:

  • MAC地址和时间戳。这两个数字可能都很难被哄骗成全部1位数
  • MAC地址和时间戳以及用户ID。与v1相同
  • MD5散列。甚至可能有用
  • PRNG。因为第四部分的第一个数字总是
    8
    9
    A
    B
    ,所以无法工作。这与版本号的
    4
    相矛盾
  • SHA-1散列。甚至可能有用
  • 到目前为止,我们排除了版本4是不可能的,其他版本是极不可能的。让我们看看变量字段

    指定了一些向后兼容的位模式(
    x
    是一个不关心的问题),即:


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

    你的问题已经得到了回答,但我想我在这里会很务实

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

    2) 您可以为每个“特殊”情况创建一个真正的GUID,而不是手动启动它们。这样,它保证是独一无二的,你可以拥有超过8个


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

    在我的上一家公司,我们使用guid作为所有数据库表的主键。我们总共实例化了100000000多个对象,从来没有出现过任何问题。

    我一直坐在这里
    自2010年1月28日起,每秒点击生成guid按钮。现在是2021年2月10日,我还没有收到一份副本。

    不太可能:DEven虽然不太可能,但肯定有比仅使用GUI来生成幻数更好的设计?!在这里的工作,一个家伙得到了一个重复的GUID一次;他不会中彩票的,因为他已经花光了所有的钱luck@Rubens法里亚斯:宇宙还没有崩溃吗?说真的,根本不存在重复的GUID。你的同事错了。(或者他的机器/操作系统的随机数生成器有很大的问题)如果GUID是随机生成的,那么包含所有相同字符的GUID不就和包含不同字符的GUID一样可能吗?这不是随机的定义,所有结果都有相同的可能性吗?“那么你是说有机会吗?”——电影引用,我忍不住-1-消息来源说有那么多GUID组合,但GUID不仅仅是随机数,因此这与给定GUID存在的概率不一样。而且,这是错误的,因为有15个这样的guid符合标准,而不仅仅是1个!:-)-1错误答案:这是在这个特定实现中获得任何1个特定GUID的概率。5316911983139663491615228241121,4中的1是多少
    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.