<?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. POJ 2823

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 35941   Accepted: 10636 ...

  2. java 以及 vs 的快捷键

    javactrl+shift+y 小写ctrl+shift+x 大写ctrl+shift+f 格式化代码 vsctrl+u 小写ctrl+shift+u 大写ctrl+k+f 格式化代码

  3. Codeforces Round #260 (Div. 2) A~C

    题目链接 A. Laptops time limit per test:1 secondmemory limit per test:256 megabytesinput:standard inputo ...

  4. AC自动机总结

    AC自动机的模板 void buildAC() { while(!q.empty()) q.pop(); q.push(); while(!q.empty()) { int x=q.front();q ...

  5. 二分图点染色 BestCoder 1st Anniversary($) 1004 Bipartite Graph

    题目传送门 /* 二分图点染色:这题就是将点分成两个集合就可以了,点染色用dfs做, 剩下的点放到点少的集合里去 官方解答:首先二分图可以分成两类点X和Y, 完全二分图的边数就是|X|*|Y|.我们的 ...

  6. C# 使用WIN32API设置外部程序窗口无边框

    使用代码 var wnd = win32.FindWindowA(null, "窗口标题"); Int32 wndStyle = win32.GetWindowLong(wnd, ...

  7. 华为上机:求2的N次幂的值

    求2的N次幂的值 描述: 求2的N次幂的值(N最大不超过31,用位运算计算,结果以十六进制进行显示). 运行时间限制: 无限制 内存限制: 无限制 输入: 数字N 输出: 2的N次方(16进制,需要按 ...

  8. lintcode:验证二叉查找树

    题目 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. 一个 ...

  9. ios开发中超简单抽屉效果(MMDrawerController)的实现

    ios开发中,展示类应用通常要用到抽屉效果,由于项目需要,本人找到一个demo,缩减掉一些不常用的功能,整理出一个较短的实例. 首先需要给工程添加第三方类库 MMDrawerController: 这 ...

  10. ios开发与安卓开源项目及库

    自己总结的iOS.mac开源项目及库 https://github.com/Tim9Liu9/TimLiu-iOS 自己总结的Android开源项目及库 https://github.com/Tim9 ...