1. 程式人生 > >Consistent Hashing 一致性雜湊演算法

Consistent Hashing 一致性雜湊演算法



按照我的理解方式 就是將所有的cache伺服器的標識分別hash到的值分佈到0-pow(2,32)中. 然後將你要取的key的hash值進行比較。取第一個大於key的hash值的伺服器。 如果從0-pow(2,32)也沒有找到,那麼則取最小hash值的伺服器。

例如 上圖中, 伺服器 a 的hash值 為 1, b的hash值為 10, c的hash值為20, 我們取 key K 的hash值為5的位置,發現key K 大於 a 小於 b , 那麼key k就存放於伺服器b上, 如果 我們取 key x 的hash值為30的位置,發現 a,b,c三個伺服器的hash值都小於 key x的hash值 , 那麼 我們取 a 伺服器作為存放伺服器。

這樣的存放方法,只會影響你最後一臺伺服器存放的key.而不會像取模方法的全域性影響。

當然這樣取key的效率就沒有取模的高了,至於採用哪種方法,還是要根據你當前業務的規模來選擇的。

另附上簡單的演算法

<?php

function consistent_hash_key($key,$servers){
if(empty($servers)){
return false;
}
$hash_serv = array();
$hash_key = sprintf("%u/n",crc32($key));
foreach ($servers as $server){
$hash_serv[sprintf("%u",crc32($server))] = $server;
}

ksort($hash_serv,SORT_REGULAR);

if(count($hash_serv) == 1){
return array_pop($hash_serv);
}
$maxHash = pow(2,32);
foreach ($hash_serv as $k => $v){
if($hash_key < $k){
return $v;
}
}
return array_shift($hash_serv);
}

for ($i=0;$i<100;$i++){
echo consistent_hash_key('s:'.$i,array('a','b','c','d','e'))."/t".consistent_hash_key('s:'.$i,array('a','b','c','d','e','f'))."/n";
}
?>