参考文章
http://blog.chinaunix.net/uid-20498361-id-4303232.html
http://blog.csdn.net/kongqz/article/details/6695417
https://my.oschina.net/goal/blog/203593?p=1
一直认为一致性hash是个很神奇的东东,技术大牛的想法果然不同凡响。
下列代码并没有作优化处理,仅供参考理解ketama算法,当然也有助于自己理解记忆。如果有错误的地方欢迎指出
1 function addServer($hostName = array()){ 2 $serverList = array(); 3 foreach($hostName as $val) { 4 for($i = 0;$i<40;$i++) { 5 $digest = md5($val.‘_‘.$i, true); 6 for ($h = 0; $h < 4; $h++) { 7 $hash = (ord($digest[3 + $h * 4]) << 24) | (ord($digest[2 + $h * 4]) << 16) 8 | (ord($digest[1 + $h * 4]) << 8) | ord($digest[$h * 4]); 9 $serverList[$val][$i*4+$h] = $hash; 10 } 11 } 12 } 13 return $serverList; 14 } 15 //md5的原因是怕用户输入前缀一致 hash一样 分布不均匀?? 16 function getKeyHash($str){ 17 $digest = md5($str,1); 18 return (ord($digest[3])<<24) | (ord($digest[2])<<16) | (ord($digest[3])<<8) | (ord($digest[0])); 19 } 20 21 22 function findKey($str){ 23 $hostName = array( 24 ‘10.100.20.1‘, 25 ‘10.100.20.2‘, 26 ‘10.100.20.3‘, 27 ‘10.100.20.4‘, 28 ‘10.100.20.5‘, 29 ‘10.100.20.6‘, 30 ); 31 $serverList = addServer($hostName); 32 $serverHash = array(); 33 foreach($serverList as $server){ 34 $serverHash = array_merge($serverHash,$server); 35 } 36 sort($serverHash); 37 $i = 0; 38 $len = count($serverHash); 39 $keyHash = getKeyHash($str); 40 if($keyHash>$serverHash[$len-1]){ 41 foreach($serverList as $key=>$val){ 42 if(in_array($serverHash[$len-1],$val)){ 43 return $key; 44 } 45 } 46 return 0; 47 } 48 while($i<$len){ 49 $curr = $serverHash[$i]; 50 $next = $serverHash[++$i]; 51 if($next>=$keyHash && $keyHash>=$curr){ 52 foreach($serverList as $key=>$val){ 53 if(in_array($serverHash[$i],$val)){ 54 return $key; 55 } 56 } 57 } 58 } 59 return false; 60 } 61 $result = array(); 62 for($i=1;$i<1000;$i++){ 63 $tmp = findKey(‘key‘.$i); 64 if(isset($result[$tmp])){ 65 $result[$tmp]++; 66 }else{ 67 $result[$tmp] = 0; 68 } 69 } 70 print_r($result);
原文:http://www.cnblogs.com/yuerdongni/p/6249755.html