【发布时间】:2012-08-19 13:35:58
【问题描述】:
假设我有大量的字符串(比如 100 亿个字符串,每个字符串约 50 个字符)。我想将字符串分配到正好 10 个桶中。每个桶应容纳大约 10% 的字符串。使用哈希函数 h() 我可以做到:
int bucket_for_s = h(s) % 10
但是,这不能保证分布的均匀性。假设我对所有字符串执行上述操作,发现 30% 进入存储桶 1,5% 进入存储桶 2,依此类推。我的问题是:
给定 h() 分布,有没有办法生成一个新的哈希函数 h2() 来更均匀地分布字符串?
或者,有没有一个过程可以生成一系列哈希函数h2()、h3()……这样1:每个哈希函数都比前一个好,2:我只需要生成一个合理的散列函数的数量?
我还应该提到,不幸的是我不能简单地将输入分成 10 个部分,因为我的输入分布在多台机器上。我正在寻找一种确定性的解决方案,我可以分别应用于每台机器并获得相同的结果(因此最终“hello”将转到存储桶 x,无论它存储在哪台机器上)。
【问题讨论】:
-
这是一个理论问题吗?或者你有这方面的经验数据吗?另外,您使用的是手工系统还是 Hadoop 之类的系统?
-
这是我在考虑设计一个手工制作的系统时想到的一个理论问题。到目前为止,我还没有找到答案。