1

我在 C# 和 .NET 4.0 中使用 Guid.NewGuid() 。而且我发现了一个有趣的事实:我生成的每个 Guid 在第 13 位都有“4”。

da1471ac-11f7- 4 fb7-a7fa-927fffe8a97c
c90058aa-5d7f- 4 bb5-b3a9-c1db197cf3b1
fa68ec75-8cd2- 4 c24-92f8-41dbbdd428a0
d4efd455-e892- 4 3ef-b7bf-9462c5dc4de4
e0a001a0-8969- 4 092-b7a2-e410ed2b351a
30ae98b9-48ae- 4 25d-b6e7-e091502d6ce2
6a95de82-67ff- 4 4c9-9f7b-e37a80462cf7
66768e46-6d60- 4 2b4-b473-2f6f8bc1559a

我已经在几台机器上试过了,结果都是一样的。任何人都可以尝试或解释一下吗?

简单的检查代码:

static void Main(string[] args)
{
     bool ok = false;
     for (int i = 0; i < 10000; i++)
     {
         var guid = Guid.NewGuid();
         if (guid.ToString()[14] != '4')
             ok = true;
         Console.WriteLine(guid);
     }
     Console.WriteLine(ok ? "No bug!" : "4bug founded!");
}
4

4 回答 4

12

确实是这样,而不是错误,它是一个功能。它指定用于生成 GUID 的方法。在 4 的情况下,这些 GUID 是随机生成的。

Eric Lippert 有一个关于这个主题的精彩系列:

第一 部分 第二 部分 第三部分

于 2012-07-23T18:21:41.400 回答
5

它在算法规范中。V4 GUID在该位置必须有一个“4”。如果您对细节感兴趣,请试一试:http ://en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm

于 2012-07-23T18:22:11.383 回答
0

这真的没有任何意义。指南由许多不同的组件生成,以帮助最大限度地提高它们的独特性。例如,我相信其中一个组件是您网卡上的 ID。部分是日期。等等。

我无法告诉您 4 的来源,但这一点也不奇怪,而且绝对不是您似乎建议的错误。

您可以在http://en.wikipedia.org/wiki/Globally_unique_identifier了解有关用于生成此数字的算法的更多信息。

于 2012-07-23T18:22:52.943 回答
0

This is expected behavior, not a bug. This position in the GUID identifies the basic generating algorithm that produced the GUID. There are a few different types; a V4 GUID is, with the exception of seven bits in defined locations of the GUID that identify the version and type variant, composed of random data. Other GUIDs use machine NICs and timestamp values.

于 2012-07-23T18:23:42.027 回答