PHP实现的服务器一致性hash分布算法示例
本文实例讲述了PHP实现的服务器一致性hash分布算法。分享给大家供大家参考,具体如下:
servers=$servers; foreach($serversas$server){ for($i=0;$i<$this->virtualNodeNum;$i++){ $this->nodeList[sprintf("%u",crc32($server.'-'.$i))]=array($server,$i); } } ksort($this->nodeList); $this->nodeHashList=array_keys($this->nodeList); } privatefunctiongetNodeIndex($key) { $this->keyHash=sprintf("%u",crc32($key)); if($this->keyHash>end($this->nodeHashList)){ $this->keyHash=$this->keyHash%end($this->nodeHashList); } if($this->keyHash<=reset($this->nodeHashList)){ return0; } $this->nodeTotalNum=count($this->nodeHashList); return$this->binaryChopIndex(0,$this->nodeTotalNum); } privatefunctionbinaryChopIndex($l=0,$r=0) { if($l<$r){ $avg=intval(($l+$r)/2); if($this->nodeHashList[$avg]==$this->keyHash){ return$avg; }elseif($this->keyHash<$this->nodeHashList[$avg]&&($avg>0)){ return$this->binaryChopIndex($l,$avg-1); }else{ return$this->binaryChopIndex($avg+1,$r); } }else{ return$l; } } publicfunctiongetServersByKey($key,$num=1) { $index=$this->getNodeIndex($key); $server=$this->nodeList[$this->nodeHashList[$index]]; if($num==1){ return$server[0]; } if($num>=count($this->servers)){ $num=count($this->servers); } $result=array($server[0]); for($i=$index+1;true;$i++){ if($i>=$this->nodeTotalNum){ $i=0; } $nextServer=$this->nodeList[$this->nodeHashList[$i]]; if(!in_array($nextServer[0],$result)){ $result[]=$nextServer[0]; } if(count($result)==$num){ break; } } return$result; } } //示例 $servers=array( '127.0.0.1:11211', '127.0.0.1:11212', '127.0.0.1:11213', '127.0.0.1:11214', '127.0.0.1:11215' ); $obj=newHashRing($servers); $servers=$obj->getServersByKey('testkey',2); print_r($servers); echo"\n";
运行结果:
Array
(
[0]=>127.0.0.1:11214
[1]=>127.0.0.1:11211
)
PS:这里再为大家提供2款hash相关在线工具供大家参考使用:
在线散列/