PHP⼀致性哈希算法的⼀种简单实现
下⾯贴⼀个⽤PHP对其进⾏的简单实现
class Hash
{
//落点集合,可以缓存起来
private $_locations = array();
//虚拟节点数量
private $virtualNodeNum = 24;
//维护的另⼀种节点和虚拟节点对应关系,⽅便删除
private $_nodes;
//将字符串转成数字
private function _hash($str)
{
return sprintf('%u', crc32($str));
}
/**
* 寻字符串所在的机器位置
* @param $str
* @return bool|mixed
*/
public function getLocation($str)
{
if(empty($this->_locations)){
return false;
}else{
$position = $this->_hash($str);
//默认取第⼀个节点
$node = current($this->_locations);
foreach($this->_locations as $k=>$v){
//如果当前的位置,⼩于或等于节点组中的⼀个节点,那么当前位置对应该节点
if($position <= $k){
$node = $v;
break;
}
}
return $node;
}
}
/**
* 添加⼀个节点
* @param $node
*/
正则匹配哈希值public function addNode($node)
{
/
/⽣成虚拟节点
for($i=0;$i<$this->virtualNodeNum;$i++){
$tmp = $this->_hash($node.$i);
$this->_locations[$tmp] = $node;
$this->_nodes[$node][] = $tmp;
}
//对节点排序
ksort($this->_locations,SORT_NUMERIC);
}
/**
* 删除⼀个节点
* @param $node
*/
public function deleteNode($node)
{
foreach($this->_nodes[$node] as $v){
unset($this->_locations[$v]);
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论