您的位置:首页 > 编程语言 > PHP开发

一致性Hash算法php实现实例

2015-07-28 20:46 656 查看
下面使用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