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

Hash 将UUID编号流随机分成10个存储桶,hash,md5,uuid,Hash,Md5,Uuid,我正在处理一系列的问题。我的最终目标是将这些数字随机分为10个桶,即,将它们中的每一个放入10个桶中的任何一个,这样,如果我处理了该流中的NUUID数字,那么在任何给定时刻,我应该在每个桶中大约有N/10个数字。我想到了以下想法: 获取给定UUID的等效16字节数组(因为每个UUID有128位) 将16个字节的无符号值相加,得到一个正整数sum 获取模和100值 模值将属于10个存储桶中的任何一个,具体取决于其值:存储桶1:[0,9],存储桶2:[10,19],桶10:[90,99] 我对大

我正在处理一系列的问题。我的最终目标是将这些数字随机分为10个桶,即,将它们中的每一个放入10个桶中的任何一个,这样,如果我处理了该流中的
N
UUID数字,那么在任何给定时刻,我应该在每个桶中大约有
N/10
个数字。我想到了以下想法:

  • 获取给定UUID的等效16字节数组(因为每个UUID有128位)
  • 将16个字节的无符号值相加,得到一个正整数
    sum
  • 获取
    模和100
  • 模值将属于10个存储桶中的任何一个,具体取决于其值:存储桶1:[0,9],存储桶2:[10,19],桶10:[90,99]
我对大约200000个UUID进行了这个实验(并对8个不同的流进行了实验),观察到每个桶有接近10%的总数(范围在9.85%到10.15%之间),这似乎是相当随机的。我的问题是:

  • 如果我不只是取16个字节的和,而是取
    UUID
    的散列值(比如
    MD5
    hash),然后执行这些步骤,我会有更好的机会随机分割它们吗?一个更普遍的问题是,是否有一种数学方法可以可视化哈希在这些场景中的作用
  • 如果您同意第(1)点,那么什么样的散列算法才能做到这一点呢
  • 如果你不同意第(1)点,那么你能建议我一个更好的算法来做同样的事情吗

  • 事实上,您在技术上描述的算法确实实现了一个哈希函数,因为它将UUID的空间映射到一组固定大小,即从1到10的数字集

    你的问题1。接下来的问题是,算法定义的哈希函数的输出如何均匀分布

    哈希函数是否比MD5更好地分配输出很难说是先验的,因为这取决于输入流的分布。然而,语言库(如MD5)中的散列函数通常实现启发式,以避免明显不合适的分布的冲突。一个具体的例子:假设您的输入流只包含集合中的UUID

    00000000-0000-0000-0000-000000000001
    00000000-0000-0000-0000-000000000010
    .
    .
    .
    10000000-0000-0000-0000-000000000000
    
    然后,它们都将映射到bucket 1,而MD5很可能会对周围的事物进行置乱


    您可以使用来衡量散列函数对输入样本的处理效果。

    散列整个UUID应该可以做到这一点。请记住,哈希函数输出是一个整数(但许多库将其转换为十六进制/其他格式的字符串)。MD5应该可以,但您应该自己检查分配的公平性。