一致性哈希算法的php实现与分析-算法

Posted 爱钓鱼的程序猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一致性哈希算法的php实现与分析-算法相关的知识,希望对你有一定的参考价值。

<?php
/*
* 一致性哈希算法
* 过程:
* 1,抽象一个圆,然后把服务器节点按一定算法得到整数有序顺时针放到圆上,圆环用2^32 个点来进行均匀切割。
* hash函数的结果应该均匀分布在[0,2^32-1]区间
* 2,由于服务器少,在圆上分布不均匀会造成数据倾斜,所以我们使用虚拟节点代替服务器的节点,一个服务器生成32个虚拟节点,或者更多。
* 3,数据要存到服务器上,通过同样的算法得到整数,在圆上顺时针跟节点对比,如果刚好大于或者等于,那么就保存在这台服务器上,
* 如果走完一圈也没找到,就落入第一个节点。

* 参数是:服务器IP,数据。
* 需要的操作是:添加服务器,删除服务器,添加数据
* Author: lms <php7在qq.com> QQ:二一九二4238
*  转发请注明来源网址http://www.thinkunion.net
*  https://blog.csdn.net/weixin_43932088
 */

class A
public $server;
public $node;

/*我们需要得到的散列值是一个正整数,所以我们可以使用times33或者crc32来获得*/
public function hashing($str)
    return sprintf('%u',crc32($str));



/*添加服务器*/
public function addServer($server)
    if(!isset($this->server[$server]))
        $this->addNode($server);
    


/*添加虚拟节点*/
public function addNode($server)
    /*每个添加32个虚拟节点,服务器少你可以添加更多,分布相对均匀以防数据倾斜*/
    for($i=0;$i<32;$i++)
        $key_node=$this->hashing($server.$i);
        $this->server[$server][]=$key_node;
        $this->node[$key_node]=$server;
    
    /*变成有序的整数数组*/
    ksort($this->node,SORT_NUMERIC);


/*删除服务器*/
public function dropServer($server)
    foreach($this->server[$server] as $v)
        unset($this->node[$v]);
    
    unset($this->server[$server]);


/*调度服务器*/
public function getServer($str)
    $key_str=$this->hashing($str);
    /*第一个节点*/
    $server=current($this->node);
    foreach($this->node as $k=>$v)
        if($k>=$key_str)
            $server=$v;
            break;
        
    
    reset($this->node);
    return $server;




$s=new A();
$s->addServer('192.168.1.2:12341');
$s->addServer('192.168.1.3:12342');
$s->addServer('192.168.1.4:12343');
$s->addServer('192.168.1.5:12344');
$s->addServer('192.168.1.6:12345');

echo $s->getServer('我存在哪里呢');
/*结果192.168.1.3:12342*/

/*删除这台服务器*/
$s->dropServer('192.168.1.3:12342');

echo $s->getServer('我存在哪里呢');
/*结果192.168.1.3:12344*/

以上是关于一致性哈希算法的php实现与分析-算法的主要内容,如果未能解决你的问题,请参考以下文章

一种快速简介的一致性哈希算法

一致性哈希(Consistent Hashing)算法的原理与实现

一致性哈希算法与Java实现

一致性hash算法

数据结构与算法—一致性哈希

一致性哈希原理与应用