Hash 将UUID编号流随机分成10个存储桶
我正在处理一系列的问题。我的最终目标是将这些数字随机分为10个桶,即,将它们中的每一个放入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] 我对大
N
UUID数字,那么在任何给定时刻,我应该在每个桶中大约有N/10
个数字。我想到了以下想法:
- 获取给定UUID的等效16字节数组(因为每个UUID有128位)
- 将16个字节的无符号值相加,得到一个正整数
sum
- 获取
值模和100
- 模值将属于10个存储桶中的任何一个,具体取决于其值:存储桶1:[0,9],存储桶2:[10,19],桶10:[90,99]
UUID
的散列值(比如MD5
hash),然后执行这些步骤,我会有更好的机会随机分割它们吗?一个更普遍的问题是,是否有一种数学方法可以可视化哈希在这些场景中的作用事实上,您在技术上描述的算法确实实现了一个哈希函数,因为它将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应该可以,但您应该自己检查分配的公平性。