Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
在.NET中创建的Guid的前四个字节的分布是否均匀?_.net_Guid - Fatal编程技术网

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

在.NET中创建的Guid的前四个字节的分布是否均匀?,.net,guid,.net,Guid,网上有大量关于guid和StackOverflow的信息。的确,关于独特性的问题层出不穷。这不是关于2^128唯一性的问题 我的问题是确定第一部分的随机性,即GUID的前四个字节在.NET中的随机性。根据研究,它被认为是最不重要的32位时间戳。但是时间戳是如何转换的呢?这有多随机 有人知道第一部分是如何由.NET构造的吗?是否真的平均分布在4个字节中 如何使用时间戳来构造前32位 时钟精度如何影响它 微软是否曾试图确保前4个字节的大小趋于随机 原因:大容量Guid的使用在前4个字节中有两个主要业

网上有大量关于guid和StackOverflow的信息。的确,关于独特性的问题层出不穷。这不是关于2^128唯一性的问题

我的问题是确定第一部分的随机性,即GUID的前四个字节在.NET中的随机性。根据研究,它被认为是最不重要的32位时间戳。但是时间戳是如何转换的呢?这有多随机

有人知道第一部分是如何由.NET构造的吗?是否真的平均分布在4个字节中

如何使用时间戳来构造前32位

时钟精度如何影响它

微软是否曾试图确保前4个字节的大小趋于随机

原因:大容量Guid的使用在前4个字节中有两个主要业务案例用于良好的随机Guid。如果每个新GUID的排列是均匀的,那么可以根据需要的分区数量,根据前1、2、3或4个字节使用表分区。我看到了一个每天有1000万次插入的20亿行表,其中128个分区使用前2个字节作为分区键。注意,在DB2下,必须使用密钥的第一部分。引用DB2DBA。这大大提高了数据库的吞吐量。第二个用途是批处理作业并行密钥分配。如果知道批处理任务大约有N行,则可以将密钥范围分配给并行作业。在没有同质拆分的情况下,调度程序必须首先计算每个作业的起始键和结束键。如果这意味着读取1亿并在内存中管理它们只是为了分派工作,那么第一个x分钟将丢失给作业分派。在这个例子中,我看到了大约15分钟。因此,有两个很好的理由可以使用并希望均匀分布guid

SAP银行系统实际上引入了一个自定义GUID例程,以解决GUID第一部分中缺少随机性的问题。对于那些可以访问SAP银行系统的用户,该功能是BANK_DISTRIBUTED_ID_CREATE。代码中的注释解释了他们为什么这样做。有权访问SAP support的用户请注意496904解释了为什么他们认为有必要修复GUI

在定制例程之前,AIX下的GUI中存在明显的偏差。C++内核。 独特的是,但随机的,特别是第一节,显然不是

更新:我决定写一个程序来调查: Windows XP上的.net 4、Dell Intel Core 2 Duo

我已经包括了测试程序的结果,以防感兴趣。 使用生成的Guid

var G = Guid.NewGuid();
在100000000个样本guid上,结果看起来还不错。(更大的一组仍在运行) 就我而言,这看起来分布均匀,足以假设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系统上的GUI示例。我们已经有20多亿人了。它们分布不均匀。2个字节中存在明显的倾斜。因此,引入了一个特殊的例程来生成同质guid。我想知道.net是否也有类似的偏差

GUI似乎分布均匀。在10亿个guid上的测试看起来不错。如果考虑前4个字节。这意味着它们对分区和范围很有用,可以粗略地推断出来,而不是从数据库中读取。

在发布之前,我已经阅读了Eric的博客(全部3篇)。我没有注意到他们在哪里解释了第一部分的随机性。随机部分包括在内,但不包括前4个字节的平均分布情况。如果你能向我指出这一点,我将不胜感激。我会删除问题,如果它被涵盖。我也读了关于转储guid的一部分的博客。我不想要也不需要。我已经看到AIX系统上的GUI示例。我们已经有20多亿人了。它们分布不均匀。2个字节中存在严重的倾斜。因此,引入了一个特殊的例程来生成同质guid。我想知道.NET是否有类似的歪斜。你应该考虑把你的评论移到问题正文中。它们提供了必要的背景信息,有助于人们更好地作出反应。(+1表示一个有趣的、经过充分研究的问题。)