1 <?
php
2
3 header("Content-type:text/html;charset=utf-8"
);
4
5 interface hash{
6
7 public function _hash(
$str);
8 }
9 interface distribution{
10
11 public function lookup(
$key);
12 }
13 /****
14 一致性哈希分布式算法原理与实现[PHP实现]
15 **/
16 class Consistent
implements hash,
distribution{
17 #存放实际节点
18 protected $_nodes=
array();
19 #定义虚拟节点的个数
20 protected $mul=64
;
21 #定义一个位置数组 记录节点所在位置
22 protected $_position=
array();
23 #算出节点
24 public function _hash(
$str){
25 return sprintf('%u',
crc32(
$str));
//把字符串转成32位符号的整数
26 }
27 #核心功能
28 public function lookup(
$key){
29 #算出当前节点
30 $point=
$this->_hash(
$key);
31 $node=
current(
$this->_position);
//先取圆环上最小的一个节点
32 #循环所以节点
33 foreach(
$this->_nodes
as $k=>
$v){
34 #找到当前节点所在在的节点数,如果没找到说明大于所以节点 既在最小的节点上
35 if(
$point<=
$k){
36 $node=
$v;
37 break;
38 }
39 }
40 return $node;
41 }
42 #增加一个节点
43 public function addNode(
$node){
44 #存储到数组中去 arrar([key=>val])
45 //$this->_nodes[$this->_hash($node)]=$node;
46 for (
$i=0;
$i <
$this->mul;
$i++
) {
47 $this->_position[
$this->_hash(
$node.'-'.
$i)]=
$node;
48 }
49 $this->
_sortNode();
50
51 }
52 #删除一个节点
53 public function delNode(
$node){
54 foreach (
$this->_position
as $k =>
$v) {
55 if(
$v==
$node){
56 unset(
$this->_position[
$k]);
57 }
58 }
59 }
60 #排序
61 protected function _sortNode(){
62 #SORT_REGULAR 根据key的大小进行排序
63 ksort(
$this->_position,
SORT_REGULAR);
64 }
65 #打印出所有的虚拟节点
66 public function getNodes(){
67 var_dump(
$this->
_position);
68 }
69 }
70 $con=
new Consistent();
71 $con->addNode('a'
);
72 $con->addNode('b'
);
73 $con->addNode('c'
);
74
75
76 echo '当前所以服务器如下:<br/>'
;
77 $con->
getNodes();
78 echo '<br/>当前的建计算的hsas落点是'.
$con->_hash('name').'<br/>'
;
79 echo 'name'.'在'.
$con->lookup('name').'节点上';
转载于:https://www.cnblogs.com/hgj123/p/4221727.html
相关资源:JAVA上百实例源码以及开源项目