假設我有大量的字符串(比如每個約50個字符的100億個字符串)。我想將這些字符串分配到10個桶中。每個桶應該佔據約10%的字符串。使用散列函數h()我可以這樣做:改善散列函數值的分佈
int bucket_for_s = h(s) % 10
但是,這並不能保證分配的均勻性。假設我爲所有字符串做了上述操作,並發現30%轉到1號桶,5%轉到2號桶,等等。我的問題是:
給定h()分佈,有沒有辦法生成一個新的散列函數h2(),它將更均勻地分配字符串?
另外,是否有一個過程,可以生成一系列的哈希函數h2(),h3()...所以1:每個哈希函數都比前一個和2更好:我只需要生成一個合理數量的散列函數?
我還應該提到,不幸的是,我不能簡單地將輸入分成10個部分,因爲我的輸入分佈在多臺機器上。我正在尋找一種確定性的解決方案,我可以單獨應用到每臺機器上並獲得相同的結果(因此最終「hello」會轉到桶x,無論它存儲在哪臺機器上)。
這是一個理論問題嗎?或者你有這方面的經驗數據?另外,你是否使用手工製作的系統或類似Hadoop的東西? – cyroxx
這是一個理論問題,在思考設計一個手工製作系統的時候跨過了我的腦海。到目前爲止,我沒有找到答案。 – user1424934