一致性雜湊演算法(consistent hash)的黑科技
這是一個來自Google的零記憶體消耗、均勻、快速、簡潔的一致性雜湊演算法 – Jump Consistent Hash
演算法的作者是Google的John Lamping和Eric Veach,論文原文連結 – 點這裡,一些討論 – 點這裡
整篇文章基於對論文原文的翻譯,摻雜自己的一些思想理解,以及對該演算法程式碼的適應場景分析修改,水平有限,難免有偏差:D
一致性雜湊(Jump Consistent Hash)演算法設計目標
平衡性,把物件均勻地分佈在所有桶中。
單調性,當桶的數量變化時,只需要把一些物件從舊桶移動到新桶,不需要做其它移動。
簡單理解就是:m個物件,n個桶,每個桶分到的物件應該在m/n個左右,誤差不應太大;在桶增加或者桶減少1時,影響到的物件應該也在m/n個左右,其餘物件不受影響。
滿足這些目標,Jump Consistent Hash的總體設計思路是:計算當bucket數量變化時,有哪些輸出需要變化。
直接上程式碼
01 02 03 04 05 06 07 08 09 10 11 12 |
int32_t
ch(int64_t key, int32_t num_buckets)
{
srand (key);
int32_t
b = -1;
int32_t
j = 0;
while
(j < num_buckets) { b
= j;
double
r = rand ()
/ ( double )RAND_MAX;
j
= floor ((b
+ 1) / r);
}
return
b;
}
|
測試用例與輸出
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|