/**
* 一致性hash的PHP实现
*/
//需要吧一个字符串转成整数的功能
interface hash {
public function _hash($str);
}
interface distribution {
public function lookup($key);
}
class Consistent implements hash,distribution {
protected $_nodes = array();
protected $_postion = array();
protected $_mul = 64;
public function _hash($str) {
return sprintf('%u',crc32($str)); //"%u" 把字符串转成32位符号整数
}
//核心功能
public function lookup($key) {
$point = $this->_hash($key);
$node = current($this->_postion); //先取圆环上最小的一节点,当成结果
foreach($this->_postion as $k=>$v) {
if ($point <= $v) {
$node = $v;
break;
}
}
return $node;
}
//添加一个节点
public function addNode($node) {
//添加虚节点
for($i=0; $i<$this->_mul; $i++) {
$this->_postion[$this->_hash($node . '-' . $i)] = $node;
}
$this->_sortPos();
#$this->_nodes[$this->_hash($node)] = $node; //如array(13亿=>a,8亿=>b)
#$this->_sortNode();
}
//循环所有的虚节点,谁的值==指定的真实节点,就把他给删掉
public function delNode($node) {
foreach($this->_postion as $k=>$v) {
if ($v == $node) {
unset($this->_postion[$k]);
}
}
}
/*按照key排序
public function _sortNode() {
ksort($this->_nodes,SORT_REGULAR);
}
//打印所有的服务器(调试)
public function printNodes() {
print_r($this->_nodes);
}*/
//按照虚节点
public function _sortPos() {
ksort($this->_postion,SORT_REGULAR);
}
public function printPos() {
print_r($this->_postion);
}
}
$con = new Consistent();
$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
echo "所有的服务器如下:<br />";
$con->printPos();
echo '当前的键计算的hash落点是',$con->_hash('name'),'<br />';
echo $con->lookup('name');
memcache一致hash算法简单实现
最新推荐文章于 2022-01-15 17:47:24 发布