非常に多数の文字列があるとします (それぞれ 50 文字以下の文字列が 100 億個あるとします)。文字列を正確に 10 個のバケットに分散したいと考えています。各バケットには、文字列の約 10% を保持する必要があります。ハッシュ関数 h() を使用すると、次のことができます。
int bucket_for_s = h(s) % 10
ただし、これは分布の均一性を保証するものではありません。すべての文字列に対して上記を実行すると、30% がバケット 1 に移動し、5% がバケット 2 に移動する、というようになります。私の質問は:
h() 分布が与えられた場合、文字列をより均等に分散する新しいハッシュ関数 h2() を生成する方法はありますか?
または、一連のハッシュ関数 h2()、h3()... を生成できるプロセスがあるので、1: 各ハッシュ関数は前のハッシュ関数よりも優れており、2: 妥当な数のハッシュのみを生成する必要があります。機能?
残念ながら、入力が複数のマシンに分散しているため、入力を単純に 10 の部分に分割することはできません。各マシンに個別に適用して同じ結果を得ることができる決定論的なソリューションを探しています(そのため、最終的に「こんにちは」は、どのマシンに保存されていても、バケット x に移動します)。