码迷,mamicode.com
首页 > 编程语言 > 详细

一致性Hash算法php实现实例

时间:2015-07-28 21:03:14      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:算法   hash   

下面使用php实现一致性Hash分布算法。
创建一个ConHash类,它有两个成员变量和三个成员方法。
变量:
serverList//isSorted //记录服务器列表是否已经排过序。
方法:
addServer:添加一个服务器到服务器列表中
removeServer:从服务器列表中删除一个服务器
lookup:从当前服务器列表中找到合适的服务器存放数据。

代码如下:

<?php
 class ConHash {
    private $serverList = array();
    private $isSorted = false;
    function addServer($server) {...}
    function removeServer($server) {...}
    function lookup($key) {...}
}
?>

1)addServer方法实现

function addServer($server) {
    $hash = mhash(MHASH_MD5,$server);

    if(!isset($serverList[$hash])) {
        $this->serverList[$hash]=$server;
    }
    $this->isSorted = false;
    return true;
}

   function removeServer($server) {
    $hash=mhash(MHASH_MD5,$server);

    if(isset($this->serverList[$hash])) {
        unset($this->serverList[$hash]);
    }
    $this->isSorted = false;
    return true;
}

3)lookup方法实现

   function lookup($key) {
    $hash=mhash(MHASH_MD5,$key);
    if(!$this->isSorted) {
        krsort($this->serverList);
        $this->isSorted=true;
    }
    foreach($this->serverList as $pos =>$server) {
        if($hash>=$pos) {
            return $server;
        }
    }
    return $this->serverList[count($this->serverList)-1];
}

lookup方法首先通过mHash函数计算出key的Hash值,然后判断服务器列表是否排过序,如果没有,就先对服务器列表进行倒序排序操作。倒序排序的作用是把服务器列表转换成一个逆时针的圆环。最后遍历服务器列表,找到一个合适的服务器返回。
4)测试代码

$hserver = new ConHash();
$hserver->addServer("192.168.1.1");
$hserver->addServer("192.168.1.2");
$hserver->addServer("192.168.1.3");
$hserver->addServer("192.168.1.4");
$hserver->addServer("192.168.1.5");
echo "保存 key1 在 server:",$hserver->lookup(‘key1‘);
echo "保存 key2 在 server:",$hserver->lookup(‘key2‘);
echo ‘===================================‘;

$hserver->removeServer("192.168.1.2");
$hserver->removeServer("192.168.1.1");
echo "保存 key1 在 server:",$hserver->lookup(‘key1‘);
echo "保存 key2 在 server:",$hserver->lookup(‘key2‘);
echo ‘===================================‘;

$hserver->addServer("192.168.1.6");
echo "保存 key1 在 server:",$hserver->lookup(‘key1‘);
echo "保存 key2 在 server:",$hserver->lookup(‘key2‘);

测试结果具有随机性,在不同的机器上,可能出现的结果会有所不同。但这个例子解释了一致性Hash算法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

一致性Hash算法php实现实例

标签:算法   hash   

原文地址:http://blog.csdn.net/hzk_wen/article/details/47111089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!