1 <?php 2 3 header("Content-type:text/html;charset=utf-8"); 4 5 interface hash{ 6 7 public function _hash($str); 8 } 9 interface distribution{ 10 11 public function lookup($key); 12 } 13 /**** 14 一致性哈希分布式算法原理与实现[PHP实现] 15 **/ 16 class Consistent implements hash,distribution{ 17 #存放实际节点 18 protected $_nodes=array(); 19 #定义虚拟节点的个数 20 protected $mul=64; 21 #定义一个位置数组 记录节点所在位置 22 protected $_position=array(); 23 #算出节点 24 public function _hash($str){ 25 return sprintf('%u',crc32($str));//把字符串转成32位符号的整数 26 } 27 #核心功能 28 public function lookup($key){ 29 #算出当前节点 30 $point=$this->_hash($key); 31 $node=current($this->_position);//先取圆环上最小的一个节点 32 #循环所以节点 33 foreach($this->_nodes as $k=>$v){ 34 #找到当前节点所在在的节点数,如果没找到说明大于所以节点 既在最小的节点上 35 if($point<=$k){ 36 $node=$v; 37 break; 38 } 39 } 40 return $node; 41 } 42 #增加一个节点 43 public function addNode($node){ 44 #存储到数组中去 arrar([key=>val]) 45 //$this->_nodes[$this->_hash($node)]=$node; 46 for ($i=0; $i < $this->mul; $i++) { 47 $this->_position[$this->_hash($node.'-'.$i)]=$node; 48 } 49 $this->_sortNode(); 50 51 } 52 #删除一个节点 53 public function delNode($node){ 54 foreach ($this->_position as $k => $v) { 55 if($v==$node){ 56 unset($this->_position[$k]); 57 } 58 } 59 } 60 #排序 61 protected function _sortNode(){ 62 #SORT_REGULAR 根据key的大小进行排序 63 ksort($this->_position,SORT_REGULAR); 64 } 65 #打印出所有的虚拟节点 66 public function getNodes(){ 67 var_dump($this->_position); 68 } 69 } 70 $con=new Consistent(); 71 $con->addNode('a'); 72 $con->addNode('b'); 73 $con->addNode('c'); 74 75 76 echo '当前所以服务器如下:<br/>'; 77 $con->getNodes(); 78 echo '<br/>当前的建计算的hsas落点是'.$con->_hash('name').'<br/>'; 79 echo 'name'.'在'.$con->lookup('name').'节点上';