一致性哈希算法的php实现与分析

  • 时间:
  • 浏览:1
  • 来源:uu快3大小_uu快3网站_开奖历史

/调度服务器/

public function getServer($str){

    $key_str=$this->hashing($str);

    /第另另4个节点/

    $server=current($this->node);

    foreach($this->node as $k=>$v){

        if($k>=$key_str){

            $server=$v;

            break;

        }

    }

    reset($this->node);

    return $server;

}

/删除这台服务器/

$s->dropServer('192.168.1.3:12342');

/删除服务器/

public function dropServer($server){

    foreach($this->server[$server] as $v){

        unset($this->node[$v]);

    }

    unset($this->server[$server]);

}

<?php

/*

* 一致性哈希算法

* 过程:

* 1,抽象另另4个圆,之后把服务器节点按一定算法得到整数有序顺时针放到 圆上,圆环用2^32 个点来进行均匀切割。

* hash函数的结果应该均匀分布在[0,2^32-1]区间

* 2,不可能 服务器少,在圆上分布不均匀会造成数据倾斜,好多好多 有亲戚亲戚朋友使用虚拟节点代替服务器的节点,另另4个服务器生成3另另4个虚拟节点,不可能 更多。

* 3,数据要存到服务器上,通过同样的算法得到整数,在圆上顺时针跟节点对比,不可能 刚好大于不可能 等于,那末就保地处这台服务器上,

* 不可能 走完一圈也没找到,就落入第另另4个节点。

echo $s->getServer('我地处哪里呢');

/结果192.168.1.3:12344/

/换成虚拟节点/

public function addNode($server){

    /每个换成3另另4个虚拟节点,服务器少你要换成更多,分布相对均匀以防数据倾斜/

    for($i=0;$i<32;$i++){

        $key_node=$this->hashing($server.$i);

        $this->server[$server][]=$key_node;

        $this->node[$key_node]=$server;

    }

    /变成有序的整数数组/

    ksort($this->node,SORT_NUMERIC);

}

/换成服务器/

public function addServer($server){

    if(!isset($this->server[$server])){

        $this->addNode($server);

    }

}

echo $s->getServer('我地处哪里呢');

/结果192.168.1.3:12342/

* 参数是:服务器IP,数据。

* 需要的操作是:换成服务器,删除服务器,换成数据(服务器在这)

/亲戚亲戚朋友需要得到的散列值是另另4个正整数,好多好多 有亲戚亲戚朋友都都里能 使用times33不可能 crc32来获得/

public function hashing($str){

    return sprintf('%u',crc32($str));

}

}

class A{

public $server;

public $node;

$s=new A();

$s->addServer('192.168.1.2:12341');

$s->addServer('192.168.1.3:12342');

$s->addServer('192.168.1.4:12343');

$s->addServer('192.168.1.5:12344');

$s->addServer('192.168.1.6:12345');