一天的辛苦工作中,我注意到我用通常的.NET方法生成的GUID在第三个代码块的开头Guid.NewGuid()
具有相同的数字4
:
efeafa5f-fe21-4ab4-ba82-b9eefd5fa225
480b64d0-6762-4afe-8496-ac7cf3292898
397579c2-a4f4-4611-9fda-16e9c1e52d6a
...
每秒钟大约有十个出现在屏幕上。在第五个GUID之后,我一直关注着这种模式。最后,最后一个里面有相同的四位,我决定我是一个幸运的人。我回到家,觉得整个世界都对像我这样的杰出人士开放。下周,我找到了一份新作品,打扫了房间,打了个电话给父母。
但是今天我又面对了同样的情况。一千次。而且我再也感觉不到选择的那个。
我已经用Google搜索了,现在我知道UUID和规范格式,其中4个保留位用于version
和2个用于variant
。
这是一个可尝试的代码段:
static void Main(string[] args)
{
while (true)
{
var g = Guid.NewGuid();
Console.WriteLine(BitConverter.ToString(g.ToByteArray()));
Console.WriteLine(g.ToString());
Console.ReadLine();
}
}
但是,还有一件事我不了解(除了如何继续生活)。为什么我们需要这些保留位?我看到了它的危害-暴露内部实现细节,更多冲突(仍然没有什么可担心的,不过有一天……),更多自杀-但我看不出任何好处。你能帮我找到任何东西吗?
这样一来,如果您更新算法,则可以更改该数字。否则,出于不同的原因,两种不同的算法可能会产生完全相同的UUID,从而导致冲突。它是一个版本标识符。
例如,考虑人为简化的UUID格式:
00000000-00000000
time - ip
现在假设我们出于某种原因将该格式更改为:
00000000-00000000
ip - time
当具有IP 12.34.56.78的计算机在时间01234567处使用第一种方法生成UUID,而后来具有IP 01.23.45.67的第二台计算机使用更新的方法在时间12345678处生成UUID时,可能会产生冲突。但是,如果我们为版本标识符保留一些位,则可能不会导致冲突。
值4特别是指随机生成的UUID(因此,它依赖于给定这么多位的冲突的微小机会),而不是其他可以使用时间,mac地址,pid或其他类型的时空标识符的组合的方法保证唯一性。
有关相关规范,请参见此处:https : //tools.ietf.org/html/rfc4122#section-4.1.3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句