<?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. 集合类 Collection

    1.Collection接口有两个子接口: List:保存元素顺序的线性表,允许有重复元素. Set:不记录元素的保存顺序,不允许有重复元素.数学中的集合 Collection接口中的方法如下: Co ...

  2. Libevent详细说明

    文章来自官方文档的部分翻译:http://www.wangafu.net/~nickm/libevent-book/ 通过这部分的了解,基本上可以使用libevent的常用功能了.有时间建议直接看官方 ...

  3. POJ 2080

    import java.util.*; public class Main { public static void main(String args[]){ Scanner cin=new Scan ...

  4. 强大的grep命令

    1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...

  5. asp.net网站中添加百度地图功能

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  6. 关于android的分辨率

    关于Android的分辨率支持,为大家翻译官方文档 看世界杯的空闲时间,翻译一下官方文档.分辨率问题是大家都很关心的(720×480会不会悲剧),而关于这个问题,android官方的文档无疑最有说服力 ...

  7. SIOCADDRT: No such process

    配置Ubuntu靶机遇到的问题 如果你添加/修改默认网关时遇到这个问题. 原因:你要添加的网关不在你主机所在的网段. 解决方法: 比如你要添加的网关是10.57.50.1 sudo route add ...

  8. 用android模拟器Genymotion定位元素

    1.下载并安装android模拟器Genymotion 2.拖apk包到模拟器,双击模拟器中的apk软件包,进入应用程序 3.下载并安装android sdk 3.1 点击...\Android\an ...

  9. sql openrowset

    select * from openrowset('sqloledb','ip';'user';'pwd','exec 库..过程') 

  10. jqGrid中实现radiobutton的两种做法

    http://blog.sina.com.cn/s/blog_4f925fc30102e27j.html   jqGrid中实现radiobutton的两种做法 ------------------- ...