分布式计算,一致性哈希算法

废话不讲了,还要上班,直接show code了 以后还需要优化.

interface hash
{
    function hashString($str);
}

interface distribution
{
    function lookup($key);
   // function addNode();
}

class Consistent implements hash,distribution
{
    protected $node = [];
    protected $mul  = 64;//代表虚拟节点数量
    protected $position = [];
    function hashString($str)
    {
        return sprintf('%u',crc32($str));
    }

    function lookup($key)
    {
        $point = $this->hashString($key);
        $node = current($this->position);//暂取一个当成结果
        foreach($this->position as $k=>$v)
        {
            if($point<=$k)
            {
                $node = $v;
                break;
            }
        }
        return $node;
    }

    function addNode($node)
    {
        for($i=0;$i<$this->mul;$i++)
        {
            $this->position[$this->hashString($node.'-'.$i)] = $node;
        }
            $this->sortPos();
    }

    protected function sortNode()
    {
        ksort($this->node,SORT_REGULAR);
    }

    protected function sortPos()
    {
        ksort($this->position,SORT_REGULAR);
    }

    function getPos()
    {
        print_r($this->position);
    }
  
    //效率不高 以后优化
    function delNode($node)
    {
        foreach($this->posititon as $k=>$v)
        {
            if($v==$node)
            {
                unset($this->position[$k]);
            }
        }
    }
}

$con = new Consistent();

$con->addNode('a');
$con->addNode('b');
$con->addNode('c');
$con->getPos();
echo '当前键落点是 '.$con->hashString('name123');
echo '<hr/>';
echo $con->lookup('name123');

一致性哈希,适用的地发很多

nickname
content