memcached hash一致性算法

来源:互联网 发布:法剧 知乎 编辑:程序博客网 时间:2024/04/29 14:50
<?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;

运行结果如下:
这里写图片描述

0 0
原创粉丝点击