<?php//原理概念请看我的上一篇随笔(http://www.cnblogs.com/tujia/p/5416614.html)或直接百度
/**
 * 接口:hash(哈希插口)、distribution(分布式算法接口)
 * 方法:
 * hash
 *     _hash,处理并返回一个字符串的哈希值
 * distribution
 *  _lookup:给它一个key,它要反正此key需要存取的目标服务器信息
 *
 *
 * 一致性哈希分布式算法类:ConsistentHash
 * 方法:
 *     addServ:    添加服务器
 *     addPos:    添加”虚拟节点“
 *     sortPos:    对所有”虚拟节点“进行排序,形成集群圈
 *  _hash:        实现插口的_hash方法
 *  _lookup:    实现插口的_lookup方法
 *
 * 测试用方法
 *     printServ:    打印集群中的服务器列表信息
 *     printPos:    打印集群中的虚拟节点列表信息
 *     decServ:    删除一台服务器及他的所有虚拟节点
 */

interface hash{
    public function _hash($str);
}

interface distribution{
    public function _lookup($key);
}

/**
* 一致性哈希算法类
*/
class ConsistentHash implements hash,distribution
{
    protected $mem_serv = array();//服务器列表
    protected $node_pos = array();//所有虚拟节点
    protected $mul         = 64;//第一台服务器弄64个虚拟节点
    /**
     * 添加服务器
     * @param array $serv_info 服务器配置信息,格式为:array('host':'127.0.0.1', 'port':11211);
     */
    public function addServ($serv_info){
        if(!is_array($serv_info) || !isset($serv_info['host']) || !isset($serv_info['port'])) return false;

        $str                        = $serv_info['host'] .':'. $serv_info['port'];
        $serv_key                     = $this->_hash($str);
        //记录服务器信息
        $this->mem_serv[$serv_key]     = $serv_info;

        //添加虚拟节点
        $this->addPos($serv_key);
        return true;
    }

    /**
     * 添加虚拟节点
     * @param string $serv_key 服务器的key
     */
    protected function addPos($serv_key){
        for($i=0; $i<$this->mul; $i++){
            $pos         = 'node_' . $serv_key . '_' . $i;
            $pos_hash     = $this->_hash($pos);
            $this->node_pos[$pos_hash] = $serv_key;
        }
        $this->sortPos();
        return true;
    }

    /**
     * 对所有虚拟节点进行排序
     */
    protected function sortPos(){
        return ksort($this->node_pos);
    }

    /**
     * 对字符串进行hash处理,返回其整数无符号整数值
     * @param  string $str 要进行处理的字符串
     */
    public function _hash($str){
        return sprintf("%u", crc32($str));
    }

    /**
     * 通过key计算它的落点服务器信息
     * @param  string $key 键
     */
    public function _lookup($key){
        $key_hash = $this->_hash($key);

        $serv_key = key($this->mem_serv);
        foreach ($this->node_pos as $pos=>$serv) {
            if($key_hash<=$pos){
                $serv_key = $serv;
                break;
            }
        }

        return $this->mem_serv[$serv_key];
    }

    /**
     * 以下的方法做为测试用
     */

    /**
     * 打印服务器列表
     * @return [type] [description]
     */
    public function printServ(){
        echo '<pre>';
        print_r($this->mem_serv);
        echo '</pre>';
    }

    public function printPos(){
        echo '<pre>';
        print_r($this->node_pos);
        echo '</pre>';
    }

    /**
     * 删除一个服务器及它的所有虚拟节点
     * @param  int $serv_key 服务器的hash值
     */
    public function decServ($serv_key=''){
        if(empty($serv_key)) $serv_key = key($this->mem_serv);
        unset($this->mem_serv[$serv_key]);
        return true;
    }
}

//测试
/*$dis = new ConsistentHash();
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11211));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11212));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11213));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11214));
$dis->addServ(array('host'=>'127.0.0.1', 'port'=>11215));

$dis->printServ();
$dis->printPos();

print_r($dis->_lookup('name'));
print_r($dis->_lookup('age'));
print_r($dis->_lookup('sex'));
print_r($dis->_lookup('height'));
print_r($dis->_lookup('weight'));*/
?>

php实现一致性哈希算法的更多相关文章

  1. 一致性哈希算法与Java实现

    原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  2. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  3. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  4. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  5. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  6. 一致性哈希算法(consistent hashing)【转】

    一致性哈希算法 来自:http://blog.csdn.net/cywosp/article/details/23397179       一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希 ...

  7. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  8. 一致性哈希算法——算法解决的核心问题是当slot数发生变化时,能够尽量少的移动数据

    一致性哈希算法 摘自:http://blog.codinglabs.org/articles/consistent-hashing.html 算法简述 一致性哈希算法(Consistent Hashi ...

  9. 一致性哈希算法原理及Java实现

     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...

  10. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...

随机推荐

  1. explicit构造函数的作用

    explicit构造函数是用来防止隐式转换的.请看下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ...

  2. JavaScript语言基础知识点图示(转)

    一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...

  3. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析--转载

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  4. DELPHI 获取本月 的第一天 和 最后一天

    USER :DateUtils 使用 StartOfTheMonth 和 EndOfTheMonth 函数获取即可:   procedure TForm1.btn1Click(Sender: TObj ...

  5. HDU 4148 Length of S(n)(字符串)

    题目 字符串处理 题意要猜,解析见代码: /* 这题每个S(n)是描述S(n-1)值 例如: S(1)=1; S(2)=11;即描述S(1)有1个1=11 S(3)=21;即描述S(2)有2个1=21 ...

  6. HDU 4493 Tutor(精度处理)

    题目 #include<stdio.h> int main() { int t; double a,s; scanf("%d",&t); while(t--) ...

  7. (转)单机上配置hadoop

    哈哈,几天连续收到百度两次电话,均是利好消息,于是乎不知不觉的自己的工作效率也提高了,几天折腾了好久终于在单机上配置好了hadoop,然后也成功的运行了一个用例,耶耶耶耶耶耶. 转自:http://w ...

  8. iOS NSString 和NSData 转换

    NSString 转换成NSData 对象 NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncodin ...

  9. [你必须知道的.NET]第三十回:.NET十年(下)

    发布日期:2009.05.11 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. /// <summary> /// 本文部分内容,已 ...

  10. Codeforces Round #337 (Div. 2) A. Pasha and Stick 水题

    A. Pasha and Stick   Pasha has a wooden stick of some positive integer length n. He wants to perform ...