<?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;
运行结果如下: