在网络和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生成。
我的问题是要确定在.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 是否有类似的偏差。