一致性Hash算法php实现实例

下面使用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算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值