首页 > 系统服务 > 详细

关于Memcached一致性hash的探究

时间:2017-01-04 20:00:07      阅读:293      评论:0      收藏:0      [点我收藏+]

参考文章

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);

 

关于Memcached一致性hash的探究

原文:http://www.cnblogs.com/yuerdongni/p/6249755.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!