假设我有大量的字符串(比如 100 亿个字符串,每个字符串约 50 个字符)。我想将字符串分配到正好 10 个桶中。每个桶应容纳大约 10% 的字符串。使用哈希函数 h() 我可以:
int bucket_for_s = h(s) % 10
然而,这并不能保证分布的均匀性。假设我对所有字符串执行上述操作,发现 30% 进入存储桶 1,5% 进入存储桶 2,依此类推。我的问题是:
给定 h() 分布,有没有办法生成一个新的散列函数 h2() 来更均匀地分布字符串?
或者,有没有一个进程可以生成一系列h2(),h3()...这样1:每个hash函数都比前一个好2:我只需要生成合理数量的hash功能?
我还应该提到,不幸的是我不能简单地将输入分成 10 个部分,因为我的输入分布在多台机器上。我正在寻找一个确定性的解决方案,我可以分别应用于每台机器并获得相同的结果(所以最终“你好”将进入存储桶 x,无论它存储在哪台机器上)。