memcached hash一致性算法

<?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ class consitantHash { private $serverList = []; private $isSort = false; private function hashAr($server) { $len = 32; $seed = 5; $hash = 0; $str = md5($server); for($i=0; $i<$len; $i++){ $hash = ($hash << $seed) + $hash + ord($str{$i}); } return $hash & 0x7FFFFFFF; } public function addServer($server) { $hashKey = $this->hashAr($server); if(!isset($this->serverList[$hashKey])){ $this->serverList[$hashKey] = $server; } $this->isSort = false; return true; } public function removeServer($server) { $hashKey = $this->hashAr($server); if(isset($this->serverList[$hashKey])) { unset($this->serverList[$hashKey]); } $this->isSort = false; return true; } public function lookServer($key) { $hashKey = $this->hashAr($key); if(!$this->isSort){ //krsort($this->serverList, SORT_NUMERIC); ksort($this->serverList); $this->isSort = true; } foreach($this->serverList as $pos => $server){ if($pos >= $hashKey){ return $server; } } return reset($this->serverList); } } $hserver = new consitantHash(); $hserver->addServer('192.168.0.1'); $hserver->addServer('192.168.0.2'); $hserver->addServer('192.168.0.3'); $hserver->addServer('192.168.0.4'); $hserver->addServer('192.168.0.5'); echo "\r\n"; echo "save key1 in server:".$hserver->lookServer('key1').PHP_EOL; echo "save key2 in server:".$hserver->lookServer('key2').PHP_EOL; echo "save key3 in server:".$hserver->lookServer('key3').PHP_EOL; $hserver->removeServer('192.168.0.3'); $hserver->removeServer('192.168.0.4'); echo "\r\n"; echo "save key1 in server:".$hserver->lookServer('key1').PHP_EOL; echo "save key2 in server:".$hserver->lookServer('key2').PHP_EOL; echo "save key3 in server:".$hserver->lookServer('key3').PHP_EOL; $hserver->addServer('192.168.0.6'); echo "\r\n"; echo "save key1 in server:".$hserver->lookServer('key1').PHP_EOL; echo "save key2 in server:".$hserver->lookServer('key2').PHP_EOL; echo "save key3 in server:".$hserver->lookServer('key3').PHP_EOL; 

运行结果如下:
《memcached hash一致性算法》

点赞