memcache一致hash算法简单实现

/**
 * 一致性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');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值