一致性哈希算法的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*/
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值