一致性哈希的PHP实现

 一致性哈希的PHP实现

<?php
// 需要一个把字符串转成整数的接口
interface hasher {
	public function _hash($str);
}
interface distribution {
	public function lookup($key);
}
class Consistent implements hasher,distribution {
	protected $_nodes = array();
	protected $_postion = array();
	protected $_mul = 64;             //每个节点对应 64 个虚节点
	public function _hash($str) {
	return sprintf('%u',crc32($str)); // 把字符串转成 32 位符号整数
}
// 核心功能
public function lookup($key) {
	$point = $this->_hash($key);
	$node = current($this->_postion); //先取圆环上最小的一个节点,当成结果
	foreach($this->_postion as $k=>$v) {
		if($point <= $k) {
			$node = $v;
			break;
		}
	}
	reset($this->_postion);
	return $node;
}
// 添加一个节点会自动添加64个虚节点
public function addNode($node) {
	if(isset($this->nodes[$node])) {
		return;
	}
	for($i=0; $i<$this->_mul; $i++) {
		$pos = $this->_hash($node . '-' . $i);
		$this->_postion[$pos] = $node;
		$this->_nodes[$node][] = $pos;
	}
	$this->_sortPos();
}
// 循环所有的虚节点,谁的值==指定的真实节点 ,就把他删掉
public function delNode($node) {
	if(!isset($this->_nodes[$node])) {
		return;
	}
	foreach($this->_nodes[$node] as $k) {
		unset($this->_postion[$k]);
	}
		unset($this->_nodes[$node]);
	}
}
protected function _sortPos() {
	ksort($this->_postion,SORT_REGULAR);
}
// 测试
$con = new Consistent();
$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
$key = '121';
	echo '此 key 落在',$con->lookup($key),'号节点';
?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值