首页 > 代码库 > 简陋版一致性hash算法实现
简陋版一致性hash算法实现
1 public function hashAction(){ 2 $server_list = range(14,114); 3 $server_slot = $this->hashAri($server_list); 4 $key_list = range(1,100000); 5 $key_slot = $this->hashAri($key_list); 6 7 //分配位子 8 $result = $this->hashSlot($server_slot,$key_slot); 9 $count = count($key_list); 10 foreach ($result as $key=>$val){ 11 echo "slot = ".$key." rate=".count($val)/$count."<br>"; 12 } 13 } 14 15 public function hashSlot($server_slot,$key_slot){ 16 $result = array(); 17 $min = 0; 18 foreach ($server_slot as $key=>$value){ 19 $max = $key; 20 foreach ($key_slot as $k=>$v){ 21 if($k>$min && $k<$max)$result[$value][] = $v; 22 } 23 $min = $key; 24 } 25 return $result; 26 } 27 28 public function hashAri($list){ 29 $result = array(); 30 foreach ($list as $key){ 31 $slot = rand(1,pow(2,30)); 32 $result[$slot] = $key; 33 } 34 ksort($result); 35 return $result; 36 }
相关博客:http://blog.csdn.net/cywosp/article/details/23397179#quote
继续的博客:http://yikun.github.io/2016/06/09/%E4%B8%80%E8%87%B4%E6%80%A7%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95%E7%9A%84%E7%90%86%E8%A7%A3%E4%B8%8E%E5%AE%9E%E8%B7%B5/
解决问题:
一般取余数的hash算法,新增或者删除机器,几乎所有的key都需要重新映射
原理:
将机器和key都按照同一个hash算法,映射到一个圆环上,所有的key顺时针,寻找离他最近的机器,找到并存储到该机器上
为了解决分布不均问题:
虚拟机器id
就是把实体机器,复制出几个虚拟id,映射到圆环上,一定程度可以负载均衡
图例:
正常的一致性hash映射
删掉一个机器的映射
添加虚拟id之后的映射
简陋版一致性hash算法实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。