随机将UUID号码流分成10个桶

时间:2017-02-13 18:50:23

标签: hash md5 uuid

我正在处理UUIDs的流。我的最终目标是随机将这些数字分成10个桶,即将它们中的每一个放入10个桶中的任何一个桶中,以便任何给定的时刻,如果我处理了来自该流的N UUID号码我每个桶中应该有大约N/10个数字。我提出了以下想法:

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

我尝试了接近大约200,000个UUID的实验(并且用8个不同的流做了),观察到每个桶有接近10%的总数(在9.85%到10.15%的范围内),这似乎是相当随意。我的问题是:

  1. 如果我不是只取16个字节的总和,而是取代MD5的哈希值(比如说UUID哈希),然后执行这些步骤,我会不会更好有机会随机分割它们吗?一个更普遍的问题是,是否有一种数学方法可视化哈希可以在这些场景中提供帮助?
  2. 如果您同意第(1)点,那么应该采用什么样的优良哈希算法来做同样的事情。
  3. 如果你不同意第(1)点,那么你能否建议我做一个更好的算法。

1 个答案:

答案 0 :(得分:1)

实际上,您所描述的算法确实实现了哈希函数,因为它将UUID的空间映射到一组固定大小的数字,即一组从1到10的数字。

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

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

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

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

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