一致性哈希(hash)算法 php实现代码
在分布式系统中,如果某业务可以由多个相同的节点处理,很容易想到用HASH的方式将业务请求分散到这些节点处理,比如memecache缓存等分 布式集群应用,如果只是简单的使用,不涉及用户用户状态等信息,则可以直接采用取模算法。正常情况下,取模算法好像也不错,但是一旦增加节点或者其中一个 节点上宕机的话,命中率将会急剧降低,所以取模算法在这种情况下弊端很明显,为此,在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法。
class Consistence
{
private $_node = [];
public function _hash($str)
{
return sprintf('%u', crc32($str));
}
public function add_node($node, $index)
{
$index = intval($index) ? intval($index) : 64;
for ($i = 0; $i < $index; $i++) {
$this->_node[$this->_hash($node . $i)] = $node;
}
$this->_sort_node();
}
public function lookup($key)
{
$hash = $this->_hash($key);
$node = current($this->_node);
foreach ($this->_node as $k => $v) {
if ($hash <= $k) {
return $v;
}
}
return $node;
}
public function remove_node($node)
{
foreach ($this->_node as $k => $v) {
if ($v == $node) {
unset($this->_node[$k]);
}
}
}
private function _sort_node()
{
$this->_node && ksort($this->_node);
}
}