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();


?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值