将UUID编号流随机分成10个存储桶

问题描述 投票:1回答:1

我正在处理UUIDs流。我的最终目标是将这些数字随机分为10个存储桶,即,将每个数字放入10个存储桶中的任何一个,这样,如果我处理了来自该流的N UUID数字,则在任何给定的时刻我都应该拥有每个存储桶中大约有N/10个数字。我想到了以下想法:

  • 获得与给定UUID等效的16字节数组(因为每个UUID具有128位)
  • [将16字节的无符号值相加以获得正整数sum
  • 获取sum modulo 100值。
  • 模值取决于其值,将属于10个存储桶中的一个:存储桶1:[0,9],存储桶2:[10,19],....,存储桶10:[90,99] 。

我尝试了将近200,000个UUID(并用8个不同的流进行了此实验),并观察到每个存储分区的总数接近总数量的10%(介于9.85%至10.15%之间),这似乎是相当随机。我的问题是:

  1. 如果不是取16个字节的总和,而是取MD5的哈希值(比如UUID哈希),然后执行这些步骤,我将有更好的机会将它们随机划分?一个更笼统的问题是,是否存在一种数学方法来可视化散列可以在这些情况下提供帮助?
  2. 如果您同意第(1)点,那么做同样的事情应该是一个好的哈希算法。
  3. 如果您不同意第(1)点,那么您能建议我做一个更好的算法吗?
hash md5 uuid
1个回答
0
投票

实际上,您所描述的算法确实实现了哈希函数,因为它将UUID的空间映射到[0,99]中的数字。

您的问题1,然后成为算法定义的哈希函数的输出均匀分布的问题。

您的哈希函数是否比MD5更好地分配了输出,很难说是先验的,因为这将取决于输入流的分配。但是,语言库(例如MD5)中附带的哈希函数通常实现启发式,以避免明显不幸的分发发生冲突。一个具体的例子:说您的输入流仅包含集合中的UUID

00000000-0000-0000-0000-000000000001
00000000-0000-0000-0000-000000000010
.
.
.
10000000-0000-0000-0000-000000000000

然后所有这些都将映射到存储区1,而MD5可能会混乱。

您可以使用chi-squared test来衡量哈希函数对输入样本的效果。

© www.soinside.com 2019 - 2024. All rights reserved.