php 实现一致性哈希,PHP一致性哈希实现。。

/**

*@author:xiaojiang 20140222

* 一致性哈希php 实现

*/

class MyHash{

//虚拟节点数

private $_virtualCounts = 2;

//虚拟节点集合

private $_circleItems = array();

//实际节点

private $_items = array();

//实际节点数

private $_itemsCount = 0;

//是否需要排序

private $_itemRelKey = array();

private $needSort = false;

private $algo;

public function __construct( hash_algo $algo = null ){

if( !$algo ){

$this->algo = new algo_md5();

}

}

public function addItem( $_item ){

if( isset( $this->_items[$_item]) ){

throw new Exception("item exists");

}

$this->_items[$_item] = array();

for( $i = 0; $i < $this->_virtualCounts; $i++ ){

$_virturalKey = $this->algo->run( $_item.$i );

$this->_circleItems[$_virturalKey] = $_item;

$this->_itemRelKey[$_item][] = $_virturalKey;

}

$this->needSort = true;

$this->_itemsCount++;

}

public function removeItem( $_item ){

if( !isset( $this->_items[$_item] ) ){

throw new Exception("item is not exists");

}

foreach( $this->_itemRelKey[$_item] as $key){

unset( $this->_circleItems[$key] );

}

unset($this->_items[$_item]);

$this->_itemsCount--;

}

public function getKey( $str ){

if($this->needSort){

$this->sortItems();

}

$_sk = $this->algo->run( $str );

echo $_sk;

foreach( $this->_circleItems as $key => $_item){

if( $key > $_sk ){

return $_item;

}

}

$ret = array_values(array_slice($this->_circleItems , 0 ,1));

return $ret[0];

}

private function sortItems(){

ksort( $this->_circleItems ,SORT_STRING );

$this->needSort = false;

}

public function _t(){

print_r($this->_circleItems);

}

}

Interface hash_algo{

function run();

}

class algo_md5{

function run( $_str ){

return MD5( $_str );

}

}

$_tstr = "B8aaaaa";

$thash = new MyHash();

$thash->addItem("10.100.200.3");

$thash->addItem("10.100.200.4");

//$a = $thash->getKey($_tstr);

//$thash->_t();

$thash->removeItem("10.100.200.4");

$thash->_t();

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值