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


?>

主要解决多服务器的分布式选择问题。。 提高中间层服务器的部署灵活性 

posted @ 2014-02-22 18:53  ﹏Sakura  阅读(2298)  评论(1编辑  收藏  举报