<?php
// 一致性哈希算法
class ConsistentHashing
{
protected $nodes = [];
protected $position = [];
protected $mul = 64; // 每个节点对应64个虚拟节点
/**
* 把字符串转为32位符号整数
*/
public function hash($str)
{
return sprintf('%u', crc32($str));
}
/**
* 核心功能
*/
public function lookup($key)
{
$point = $this->hash($key);
//先取圆环上最小的一个节点,当成结果
$node = current($this->position);
// 循环获取相近的节点
foreach ($this->position as $key => $val) {
if ($point <= $key) {
$node = $val;
break;
}
}
reset($this->position);
return $node;
}
/**
* 添加节点
*/
public function addNode($node)
{
if(isset($this->nodes[$node])) return;
// 添加节点和虚拟节点
for ($i = 0; $i < $this->mul; $i++) {
$pos = $this->hash($node . '-' . $i);
$this->position[$pos] = $node;
$this->nodes[$node][] = $pos;
}
// 重新排序
$this->sortPos();
}
/**
* 删除节点
*/
public function delNode($node)
{
if (!isset($this->nodes[$node])) return;
// 循环删除虚拟节点
foreach ($this->nodes[$node] as $val) {
unset($this->position[$val]);
}
// 删除节点
unset($this->nodes[$node]);
}
/**
* 排序
*/
public function sortPos()
{
ksort($this->position, SORT_REGULAR);
}
}
// 测试
$con = new ConsistentHashing();
$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
$con->addNode('d');
$key1 = 'www.zhihu.com';
$key2 = 'www.baidu.com';
$key3 = 'www.google.com';
echo 'key' . $key1 . '落在' . $con->lookup($key1) . '号节点上!<br>';
echo 'key' . $key2 . '落在' . $con->lookup($key2) . '号节点上!<br>';
echo 'key' . $key3 . '落在' . $con->lookup($key3) . '号节点上!<br>';
Memcached 一致性哈希算法PHP实现
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(...