如何使用C#生成UUID版本4

17

我的要求是从C#代码生成版本4 UUID用于Google API会话令牌,但我不确定Guid.NewGuid()方法返回哪个版本的GUID。例如版本

阅读了Google和博客,但没有得到确定的答案。 Guid.NewGuid()是否根据RFC4122产生UUID版本4?

先行致谢


1
我阅读了这篇博客,奇怪的是微软没有明确写出Guid.NewGuid()将生成UUID v4 guid。也许这是法律义务。无论如何,我认为这里有一个相当不错的实现:https://www.cryptosys.net/pki/uuid-rfc4122.html,请看看它是否适合您。 - Soumen Mukherjee
@SoumenMukherjee:感谢朋友的帮助。 - Mansinh
1个回答

28

GUID是V4版本的唯一标识符...你生成的每个GUID都会像这样

18acac20-991e-437e-9529-a441452f6b7e
d6d68639-64c2-452e-95b7-16cf6dbf5301
b0943b6d-4779-4771-92bf-cc2d634fb671
218b5620-d30d-46d9-9c88-38a4ac64266e
de03042c-792f-4689-80ca-26287ceb2129
1175bb5d-d35e-4a46-aaac-0825c749dc3a
42864583-c0f6-4e44-8710-39c9a9146d43
223ca924-4b77-4931-bb94-c1d371894683
2c4495ab-19e4-4aeb-b647-10db8625791c
f5894345-cbe3-4fc7-92c3-d6d863f70411
              ^    ^
              1    2

上面位置 1 的数字始终为 4,而位置 2 的数字始终是 89AB 中的一个。

你可以通过确认这一点来进行验证。

var cts = new CancellationTokenSource();

var parallelOptions = new ParallelOptions() { MaxDegreeOfParallelism = 8, CancellationToken = cts.Token };
Parallel.For(0, int.MaxValue, parallelOptions, (i) =>
{
    var guid = Guid.NewGuid().ToString();
    var four = guid.ElementAt(14);
    var ab89 = guid.ElementAt(19);

    if (four != '4') cts.Cancel();
    if (ab89 != 'a' && ab89 != 'b' && ab89 != '8' && ab89 != '9') cts.Cancel();

    if ((i % 100000) == 0 && i < (int.MaxValue / 8))
    {
        Console.WriteLine($"{i * 8:n}"); // roughly   
    }
});

如果你有疑问,那么在合理的时间内它将运行大约40亿次尝试


我应该直接发送Guid吗?带破折号或其他标识字符还是不带?在Google文档中,他们只将123456789写作会话令牌... - o_w
这里有关于这个话题的讨论: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4956142a-0a5d-4f1e-b102-93a3eea1b5d5/does-guidnewguid-produce-uuid-version-4-according-to-rfc4122?forum=netfxbcl他让微软进行了调查,发现他们的GUID实现偶然正是UUIDv4,但他们不能保证未来不会更改。如果更改了,他们将确保它不会冲突,并在MSDN文档中注明更改情况。 - bobpaul
1
通常情况下,您应该使用UUID作为带有破折号的格式化十六进制字符串或16字节数字。不清楚您正在查看哪个“Google文档”,但我不建议使用没有破折号的32个字符。 - bobpaul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接