ConsistentHash.php 1002 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\common\model;
  4. class ConsistentHash {
  5. protected $nodes = array();
  6. protected $virtualNodes = array();
  7. protected $isSort = false;
  8. protected $virtualNodesNum = 10;
  9. public function __construct(){
  10. }
  11. public function setVirtualNum($num){
  12. $this->virtualNodesNum = $num;
  13. }
  14. public function addNode($node){
  15. $this->nodes[] = $node;
  16. for($i=0;$i<$this->virtualNodesNum;$i++){
  17. $virtualHash = sprintf('%u',crc32($node.$i));
  18. $this->virtualNodes[$virtualHash] = $node;
  19. }
  20. }
  21. public function addNodes($nodes){
  22. foreach($nodes as $node){
  23. $this->addNode($node);
  24. }
  25. }
  26. public function getNode($key){
  27. if(!$this->isSort){
  28. ksort($this->virtualNodes);
  29. $this->sort = true;
  30. }
  31. $hashKey = sprintf("%u",crc32($key));
  32. foreach($this->virtualNodes as $hash=>$node){
  33. //环中比当前值大的那个节点
  34. if($hash>$hashKey){
  35. return $node;
  36. }
  37. }
  38. return $node[0];
  39. }
  40. }
  41. ?>