PHP一致性Hash分佈

//hash函數function kHash($key){$md5 = substr(md5($key),0,8);$seed = 31;$hash = 0;for ($i = 0; $i < 8; $i++){$hash = $hash*$seed + ord($md5{$i});$i++;}return $hash & 0x7FFFFFFF;}//一致性hash算法實例class FlexiHash{private $serverList = [];private $sorted = false;public function addServer($ser){$hash = kHash($ser);if (!isset($this->serverList[$hash])){$this->serverList[$hash] = $ser; }$this->sorted = false; }public function delServer($ser){$hash = khash($ser);if (isset($this->serverList[$hash])){unset($this->serverList[$hash]);$this->sorted = false; } }public function lookUp($key){$hash = kHash($key);if (!$this->sorted){krsort($this->serverList, SORT_NUMERIC); }foreach ($this->serverList as $key => $value){if ($hash >= $key){return $value; } }reset($this->serverList);return $this->serverList[key($this->serverList)]; }}//添加服務器$server = new FlexiHash();$server->addServer('192.168.1.25');$server->addServer('192.168.1.4');$server->addServer('192.168.1.57');$server->addServer('192.168.1.8');$server->addServer('192.168.1.33');//根據key算錯相應的服務器$arr = [];for($i=0; $i < 100; $i++) { $arr[] = $server->lookUp('key'.$i);}var_dump($arr);


分享到:


相關文章: