123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- <?php
- declare (strict_types = 1);
- namespace app\common\model;
-
- class ConsistentHash {
- protected $nodes = array();
- protected $virtualNodes = array();
- protected $isSort = false;
- protected $virtualNodesNum = 10;
- public function __construct(){
- }
-
- public function setVirtualNum($num){
- $this->virtualNodesNum = $num;
- }
- public function addNode($node){
- $this->nodes[] = $node;
- for($i=0;$i<$this->virtualNodesNum;$i++){
- $virtualHash = sprintf('%u',crc32($node.$i));
- $this->virtualNodes[$virtualHash] = $node;
- }
- }
- public function addNodes($nodes){
- foreach($nodes as $node){
- $this->addNode($node);
- }
- }
-
- public function getNode($key){
- if(!$this->isSort){
- ksort($this->virtualNodes);
- $this->sort = true;
- }
- $hashKey = sprintf("%u",crc32($key));
- foreach($this->virtualNodes as $hash=>$node){
- //环中比当前值大的那个节点
- if($hash>$hashKey){
- return $node;
- }
- }
- return $node[0];
- }
-
- }
- ?>
|