香港高速VIP云机房火爆上线啦!无需备案,开通即用!配套《巅云自助建站系统3.0》将带给您飞一般的可视化拖拽建站体验,欢迎免费体验。

建站专题

PHP实现的一致性HASH算法示例

一佰互联网站开发设计(www.yinxi.net) 发布日期 2019-04-25 14:40:45 浏览数: 21

本文实例讲述了PHP实现的一致性HASH算法。分享给大家供大家参考,具体如下:

<?php// +----------------------------------------------------------------------// | Perfect Is Shit// +----------------------------------------------------------------------// | PHP实现:一致性HASH算法// +----------------------------------------------------------------------// | Author: alexander <gt199899@gmail.com>// +----------------------------------------------------------------------// | Datetime: 2017-01-11 16:01:36// +----------------------------------------------------------------------// | Copyright: Perfect Is Shit// +----------------------------------------------------------------------class ConsistentHashing{  // 圆环  // hash -> 节点  private $_ring = array();  // 所有节点  // 节点 -> hash  public $nodes = array();  // 每个节点的虚拟节点  public $virtual = 64;  /**   * 构造   * @param array $nodes 初始化的节点列表   */  public function __construct($nodes = array())  {    if (!empty($nodes)) {      foreach ($nodes as $value) {        $this->addNode($value);      }    }  }  /**   * 获取圆环内容   * @return array $this->_ring   */  public function getRing()  {    return $this->_ring;  }  /**   * time33 函数   * @param string $str   * @return 32位正整数   * @author 大神们   */  public function time33($str)  {    // hash(i) = hash(i-1) * 33 + str[i]    // $hash = 5381; ## 将hash设置为0,竟然比设置为5381分布效果更好!!!    $hash = 0;    $s  = md5($str); //相比其它版本,进行了md5加密    $seed = 5;    $len = 32;//加密后长度32    for ($i = 0; $i < $len; $i++) {      // (hash << 5) + hash 相当于 hash * 33      //$hash = sprintf("%u", $hash * 33) + ord($s{$i});      //$hash = ($hash * 33 + ord($s{$i})) & 0x7FFFFFFF;      $hash = ($hash << $seed) + $hash + ord($s{$i});    }    return $hash & 0x7FFFFFFF;  }  /**   * 增加节点   * @param string $node 节点名称   * @return object $this   */  public function addNode($node)  {    if (in_array($node, array_keys($this->nodes))) {      return;    }    for ($i = 1; $i <= $this->virtual; $i++) {      $key         = $this->time33($node . "-" . $i);      $this->_ring[$key]  = $node;      $this->nodes[$node][] = $key;    }    ksort($this->_ring, SORT_NUMERIC);    return $this;  }  /**   * 获取字符串的HASH在圆环上面映射到的节点   * @param string $key   * @return string $node   */  public function getNode($key)  {    $node = current($this->_ring);    $hash = $this->time33($key);    foreach ($this->_ring as $key => $value) {      if ($hash <= $key) {        $node = $value;        break;      }    }    return $node;  }  /**   * 获取映射到特定节点的KEY   * 此方法需手动调用,非特殊情况不建议程序中使用此方法   * @param string $node   * @param string $keyPre   * @return mixed   */  public function getKey($node, $keyPre = ""){    if(!in_array($node, array_keys($this->nodes))){      return false;    }    $result = false;    for($i=1;$i<=10000;$i++){      $key = $keyPre . md5(rand(1000, 9999));      if($this->getNode($key) == $node){        $result = true;        break;      }    }    return $result ? $key : false;  }}$ch_obj = new ConsistentHashing();$ch_obj->addNode("node_1");$ch_obj->addNode("node_2");$ch_obj->addNode("node_3");$ch_obj->addNode("node_4");$ch_obj->addNode("node_5");$ch_obj->addNode("node_6");// +----------------------------------------------------------------------// | 查看key映射到的节点// +----------------------------------------------------------------------$key1 = "asofiwjamfdalksjfkasasdflasfja";$key2 = "jaksldfjlasfjsdjfioafaslkjflsadkjfl";$key3 = "asjldflkjasfsdjflkajkldsjfksajdlflajs";$key4 = "iowanfasijfmasdnfoas";$key5 = "pqkisndfhoalnfiewlkl";$key6 = "qjklasjdifoajfalsjflsa";echo sprintf("%-50s 映射到节点 %s", $key1, $ch_obj->getNode($key1));echo sprintf("%-50s 映射到节点 %s", $key2, $ch_obj->getNode($key2));echo sprintf("%-50s 映射到节点 %s", $key3, $ch_obj->getNode($key3));echo sprintf("%-50s 映射到节点 %s", $key4, $ch_obj->getNode($key4));echo sprintf("%-50s 映射到节点 %s", $key5, $ch_obj->getNode($key5));echo sprintf("%-50s 映射到节点 %s", $key6, $ch_obj->getNode($key6));// +----------------------------------------------------------------------// | 查看圆环和节点信息// +----------------------------------------------------------------------// var_dump($ch_obj->getRing());// var_dump($ch_obj->nodes);// +----------------------------------------------------------------------// | 获取特定节点的KEY// +----------------------------------------------------------------------// $key1 = $ch_obj->getKey("node_1", "pre_");// var_dump($key1);// +----------------------------------------------------------------------// | 测试分布// +----------------------------------------------------------------------// $keys = array();// $rings = array();// for ($i = 1; $i <= 60000; $i++) {//   $key = sha1(rand(1000000,9999999));//   $node = $ch_obj->getNode($key);//   $rings[$node] = isset($rings[$node]) ? ++$rings[$node] : 1;// }// var_dump($rings);

运行结果:

asofiwjamfdalksjfkasasdflasfja           映射到节点 node_1jaksldfjlasfjsdjfioafaslkjflsadkjfl        映射到节点 node_2asjldflkjasfsdjflkajkldsjfksajdlflajs       映射到节点 node_1iowanfasijfmasdnfoas                映射到节点 node_2pqkisndfhoalnfiewlkl                映射到节点 node_3qjklasjdifoajfalsjflsa               映射到节点 node_5

PS:这里再为大家提供2款hash相关在线工具供大家参考使用:

在线散列/哈希算法加密工具:http://tools.jb51.net/password/hash_encrypt

在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:http://tools.jb51.net/password/hash_md5_sha

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php加密方法总结》、《PHP编码与转码操作技巧汇总》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》及《php正则表达式用法总结》

希望本文所述对大家PHP程序设计有所帮助。

一佰互联是全国知名建站品牌服务商,我们有九年网站建设、网站制作、网页设计、php开发和域名注册及虚拟主机服务经验,提供的自助建站服务更是全国有名。近年来还整合团队优势自主开发了可视化多用户”巅云建站系统“3.0平台版,拖拽排版网站制作设计,轻松实现pc站、手机微网站、小程序、APP一体化全网营销网站建设 ,已成功的为全国上百家网络公司提供自助建站平台搭建服务。

相关新闻more

28
04月
smarty模板引擎使用内建函数foreac

本文实例讲述了smarty内建函数foreach的使用方法,分享给大家供大家参考。具体如下:显示文件:index.php:复制代码 代码如下... >>详情

28
03月
如何做网站才能给排名添砖加瓦

简介:在很多情况下总是把网站开发的核心集中在客户体验方面,却往往忽视了网站本身自有的推广优势。样版做网站虽然方便,然而也经常听一些企业人员说... >>详情

05
04月
禁令生效,苹果手机下架风险加大

简介:新京报讯(记者 马婧 陆一夫)12月10日,高通宣布,福州中级人民法院授予了高通针对苹果公司四家中国子公司提出的两个诉中临时禁令,要求... >>详情

27
04月
PHP将二维数组某一个字段相同的数组合并起来

本文实例讲述了PHP将二维数组某一个字段相同的数组合并起来的方法。分享给大家供大家参考,具体如下:例子:array(3) { [0]=>... >>详情

营业执照. cdn加速服务 备案系统认证 网络安全协会 我们的支付方式AAA认证
上海 北京 深圳 广州 天津 杭州 南京 武汉 成都 沈阳 大连 长沙 济南 青岛 苏州 福州 无锡 哈尔滨 宁波 重庆 大庆 厦门 西安 长春 珠海 郑州 海口 昆明 太原 石家庄 温州 合肥 乌鲁木齐 南宁 南通 合肥 兰州 呼和浩特 贵阳 烟台 秦皇岛 包头 唐山 银川 汕头 连云港 威海 西宁 湛江 北海 万州 涪陵 长寿 黔江 永川 丰都 忠县 江津 南川 开县 云阳 万盛 梁平 垫江 巫山 城口 建站宝盒 免费建站 门户网站建设 微信网站 手机网站 门户网站制作

7x24小时服务电话:18581389571 传真:023-85725751 免费建站交流群:236412099 139947842(自助建站交流) E-Mail:post@yinxi.net 网站投诉:
重庆楚捷科技有限公司 一佰互联©版权所有 自助建站(www.yinxi.net,Inc.) 2001-2020 All Rights Reserved 本站程序受法律保护,网站法律顾问:ITLAW-庄毅雄律师
中华人民共和国信息产业部网站备案号:渝ICP备12000592号