在.NET中创建的Guid的前四个字节有多均匀分布?

5
在网络和StackOverflow上有很多关于GUID的信息,以及关于独一无二性的无尽问题。但这个问题不是关于2^128的独一无二性的问题
我的问题是要确定在.NET中,GUID的第一部分,特别是GUID的四个字节有多随机。根据研究,它被认为是时间戳的最低有效32位。但是时间戳是如何转换的?它到底有多随机?
有人知道.NET如何构建第一部分,并且是否真正均匀地分布在4个字节中吗?
时间戳是如何用来构造前32位的?
时钟精度会如何影响它?
Microsoft有没有试图确保前4个字节倾向于随机或不是? WHY:高频率Guid的使用与Good random guids in the first 4 bytes的主要业务案例有关。如果每个新的GUID都有一个均匀的分布,则可以根据需要分为1、2、3或4个字节的表分区键。我曾经见过一个有20亿行记录的表,每天插入1000万条记录,使用了前两个字节作为分区键,有128个分区。注意,在DB2下必须使用键的第一部分。引用DB2 DBA。这极大地提高了DB的吞吐量。第二个用途是批处理任务的并行键分配。如果知道需要大约N行作为批处理任务,可以将键范围分配给并行作业。如果没有同类划分,则调度程序必须首先计算每个作业的起始和终止键。如果这意味着读取1亿记录并在内存中管理它们以便分派工作,那么前x分钟将浪费在作业调度上。在我所看到的例子中,时间约为15分钟。因此,使用均匀分布的GUID有两个非常好的理由。
SAP银行系统实际上引入了自定义GUID例程来解决GUID的第一部分缺乏随机性的问题。对于那些可以访问SAP银行系统的人,该函数是BANK_DISTRIBUTED_ID_CREATE。代码中的注释解释了他们为什么这样做。对于那些可以访问SAP支持的人,有一个说明496904,解释了他们为什么认为需要修复guids。
在自定义例程之前,在AIX下,GUIDs中存在明显的偏差。C++ kernel。 独特,但随机性特别是第一部分,显然不够。
更新:因为我决定写一个程序来研究: .net 4在Windows XP上,Dell Intel Core 2 Duo。
我已经包含了测试程序的结果,以防感兴趣。 使用Guid生成。
var G = Guid.NewGuid();

这些结果在样本中100,000,000个guids表现良好。(更大的集合仍在运行中) 对于我的目的而言,这看起来足够均匀分布,可以假定是OK的。

Byte 0: with Value 6A was least frequent : 389140 times
Byte 0: with Value 58 was most  frequent : 392241 times
Byte 1: with Value 25 was least frequent : 388905 times
Byte 1: with Value B3 was most  frequent : 392552 times
Byte 2: with Value D2 was least frequent : 389114 times
Byte 2: with Value CC was most  frequent : 391984 times
Byte 3: with Value 66 was least frequent : 388744 times
Byte 3: with Value 16 was most  frequent : 392838 times

编辑:根据评论添加的背景研究

我在 AIX 系统上看过 GUID 的示例。我们已经有超过 20 亿个了。它们并不是均匀分布的。2 字节存在明显的偏差。因此,引入了一个特殊的例程来生成同质的 GUID。我想知道 .net 是否有类似的偏差。


5
http://blogs.msdn.com/b/ericlippert/archive/2012/04/24/guid-guide-part-one.aspx http://blogs.msdn.com/b/ericlippert/archive/2012/04/30/guid-guide-part-two.aspx http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx - SLaks
http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx - Mitch Wheat
在发布之前,我已经阅读了Eric的博客(全部三篇)。我没有注意到他们解释了FIRST部分的随机性。虽然有涉及到随机部分,但并没有说明前4个字节是如何均匀分布的。如果您能指出这一点,我将不胜感激。如果已经有相关内容,我会删除这个问题。 - phil soady
我也读了关于转储GUID一部分的博客。我不想要也不需要那个。我在AIX系统上看到过GUID的样本。我们已经有超过20亿个了。它们并没有均匀分布。2个字节中存在严重的偏差。因此,引入了一个特殊的例程来生成同质的GUID。我想知道.NET是否有类似的偏差。 - phil soady
3
考虑将您的评论移动到问题正文中。它们提供了重要的背景信息,有助于人们更好地制定回答。(对于一个有趣、研究充分的问题给予赞赏。) - JDB
如果在原帖中添加注释是正确的做法,那么我会整理它。 - phil soady
1个回答

1

Guids似乎均匀分布。对10亿个Guid的测试结果良好。如果考虑前4个字节,则它们可用于分区,范围可以粗略地推断而不是从数据库中读取。


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