本文实例讲述了php一致性hash分布式算法封装类定义与用法。分享给大家供大家参考,具体如下:
一、无虚拟节点实现
<?php /** * 一致性hash分布式算法 * @param $key * @return int * 实现步骤 * 1.先将0~ 是32位最大带符号整数(0x7fffffff) 想象成一个闭环 * 2.将服务器列表通过hash算法分布在 圆环之中 * 3.将key值也分布在圆环之中 * 4.通过_issorted判断服务器是否需要进行倒序排序 排序后遍历服务器 找到最近的服务器 返回 * hash算法是不保证平衡的 为了尽量保证平衡性 我们应该加入虚拟节点数 将一个服务器节点虚拟化成为多个 较大程度上保证了平衡性 */ class flexihash{ private $_serverlist = array(); private $_issorted = false; private $_virtual_node_num = 20;//虚拟节点数 服务器越少 增加的虚拟节点数应该越多 //通过hash算法返回一个整数值 protected function myhash($key){ $md5 = substr(md5($key),0,8); $seed = 31; //种子值 $hash=0; for($i=0;$i<8;$i++){ $hash = $hash*$seed+ord($md5{$i}); //ord 返回ascii值 $i++; } return $hash&0x7fffffff; //0x7fffffff表示最大值 } //添加服务器 function addserver($server){ $hash =$this->myhash($server. '#1'); if(!isset($this->_serverlist[$hash])) { for ($i = 1; $i <= $this->_virtual_node_num; $i++) { $hash = $this->myhash($server . '#' . $i); $this->_serverlist[$hash] = $server; } } $this->_issorted = false; return true; } //删除服务器 function removeserver($server){ for ($i = 1; $i <= $this->_virtual_node_num; $i++) { $hash = $this->myhash($server . '#' . $i); unset($this->_serverlist[$hash]); } $this->_issorted = false; return true; } //获取服务器 function lookup($key){ $hash =$this->myhash($key); if(!$this->_issorted){ krsort($this->_serverlist,sort_numeric); $this->_issorted = true; } foreach($this->_serverlist as $pos=>$server){ if($hash >= $pos) return $server; } return end($this->_serverlist); } public function getserverlist(){ krsort($this->_serverlist,sort_numeric); return $this->_serverlist; } } //demo test $hserver = new flexihash(); //添加服务器 $hserver->addserver('192.168.1.1'); $hserver->addserver('192.168.1.2'); $hserver->addserver('192.168.1.3'); $hserver->addserver('192.168.1.4'); $hserver->addserver('192.168.1.5'); $key1='key1111'; $key2='key2222'; $key2='key3333'; $key2='key4444'; $key2='key5555'; $key2='key6666'; echo "save key1 in server: ".$hserver->lookup($key1).php_eol; echo "save key2 in server: ".$hserver->lookup($key2).php_eol; echo "save key1 in server: ".$hserver->lookup($key3).php_eol; echo "save key2 in server: ".$hserver->lookup($key4).php_eol; echo "save key1 in server: ".$hserver->lookup($key5).php_eol; echo "save key2 in server: ".$hserver->lookup($key6).php_eol; echo "================================================".php_eol; //移除服务器 key值将自动转义到下一台服务器 $hserver->removeserver('192.168.1.4'); echo "save key1 in server: ".$hserver->lookup($key1).php_eol; echo "save key2 in server: ".$hserver->lookup($key2).php_eol; echo "save key1 in server: ".$hserver->lookup($key3).php_eol; echo "save key2 in server: ".$hserver->lookup($key4).php_eol; echo "save key1 in server: ".$hserver->lookup($key5).php_eol; echo "save key2 in server: ".$hserver->lookup($key6).php_eol; echo "================================================".php_eol; //恢复故障服务器 key值将恢复原来服务器 $hserver->addserver('192.168.1.4'); echo "save key1 in server: ".$hserver->lookup($key1).php_eol; echo "save key2 in server: ".$hserver->lookup($key2).php_eol; echo "save key1 in server: ".$hserver->lookup($key3).php_eol; echo "save key2 in server: ".$hserver->lookup($key4).php_eol; echo "save key1 in server: ".$hserver->lookup($key5).php_eol; echo "save key2 in server: ".$hserver->lookup($key6).php_eol;
二、运行结果:
save key1 in server: 192.168.1.4
save key2 in server: 192.168.1.4
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.3
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.3
================================================
save key1 in server: 192.168.1.2
save key2 in server: 192.168.1.5
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.3
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.3
================================================
save key1 in server: 192.168.1.4
save key2 in server: 192.168.1.4
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.3
save key1 in server: 192.168.1.3
save key2 in server: 192.168.1.3
ps:这里再为大家提供2款hash相关在线工具供大家参考使用:
在线散列/哈希算法加密工具:
在线md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:
更多关于php相关内容感兴趣的读者可查看本站专题:《php加密方法总结》、《php编码与转码操作技巧汇总》、《php数学运算技巧总结》、《php数组(array)操作技巧大全》、《php字符串(string)用法总结》、《php数据结构与算法教程》、《php程序设计算法总结》及《php正则表达式用法总结》
希望本文所述对大家php程序设计有所帮助。
如对本文有疑问, 点击进行留言回复!!
[ACTF2020 新生赛]Include 1【文件包含】【读取代码】
算法题解 - 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者组
推荐一个程序员必备网站之一:Dev Hints ,非常实用!
网友评论