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

PHP一致性哈希实现。。

2015-08-14 16:51 561 查看
<?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();

?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: