一致性Hash算法php实现实例
2015-07-28 20:46
656 查看
下面使用php实现一致性Hash分布算法。
创建一个ConHash类,它有两个成员变量和三个成员方法。
变量:
serverList//保存服务器列表isSorted //记录服务器列表是否已经排过序。
方法:
addServer:添加一个服务器到服务器列表中
removeServer:从服务器列表中删除一个服务器
lookup:从当前服务器列表中找到合适的服务器存放数据。
代码如下:
1)addServer方法实现
3)lookup方法实现
lookup方法首先通过mHash函数计算出key的Hash值,然后判断服务器列表是否排过序,如果没有,就先对服务器列表进行倒序排序操作。倒序排序的作用是把服务器列表转换成一个逆时针的圆环。最后遍历服务器列表,找到一个合适的服务器返回。
4)测试代码
测试结果具有随机性,在不同的机器上,可能出现的结果会有所不同。但这个例子解释了一致性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算法。
相关文章推荐
- c语言实现hashmap(转载)
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Ruby中Hash的11个问题解答
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- Ruby简明教程之数组和Hash介绍
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析