• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现的服务器一致性hash分布算法示例

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

    ?php
    /**
     * 对服务器进行一致性hash分布算法
     */
    class HashRing
    {
      private $servers = array();
      private $nodeList = array();
      private $nodeHashList = array();
      private $nodeTotalNum = 0;
      private $virtualNodeNum = 32;
      private $keyHash = '';
      public function __construct($servers)
      {
        $this->servers = $servers;
        foreach ($servers as $server) {
          for ($i = 0; $i  $this->virtualNodeNum; $i++) {
            $this->nodeList[sprintf("%u", crc32($server.'-'.$i))] = array($server, $i);
          }
        }
        ksort($this->nodeList);
        $this->nodeHashList = array_keys($this->nodeList);
      }
      private function getNodeIndex($key)
      {
        $this->keyHash = sprintf("%u", crc32($key));
        if ($this->keyHash > end($this->nodeHashList)) {
          $this->keyHash = $this->keyHash % end($this->nodeHashList);
        }
        if ($this->keyHash = reset($this->nodeHashList)) {
          return 0;
        }
        $this->nodeTotalNum = count($this->nodeHashList);
        return $this->binaryChopIndex(0, $this->nodeTotalNum);
      }
      private function binaryChopIndex($l=0, $r=0)
      {
        if ($l  $r) {
          $avg = intval(($l+$r) / 2);
          if ($this->nodeHashList[$avg] == $this->keyHash) {
            return $avg;
          } elseif ($this->keyHash  $this->nodeHashList[$avg]  ($avg > 0)) {
            return $this->binaryChopIndex($l, $avg-1);
          } else {
            return $this->binaryChopIndex($avg+1, $r);
          }
        } else {
          return $l;
        }
      }
      public function getServersByKey($key, $num=1)
      {
        $index = $this->getNodeIndex($key);
        $server = $this->nodeList[$this->nodeHashList[$index]];
        if ($num == 1) {
          return $server[0];
        }
        if ($num >= count($this->servers)) {
          $num = count($this->servers);
        }
        $result = array($server[0]);
        for ($i=$index+1; true; $i++) {
          if ($i >= $this->nodeTotalNum) {
            $i = 0;
          }
          $nextServer = $this->nodeList[$this->nodeHashList[$i]];
          if (!in_array($nextServer[0], $result)) {
            $result[] = $nextServer[0];
          }
          if (count($result) == $num) {
            break;
          }
        }
        return $result;
      }
    }
    //示例
    $servers = array(
      '127.0.0.1:11211',
      '127.0.0.1:11212',
      '127.0.0.1:11213',
      '127.0.0.1:11214',
      '127.0.0.1:11215'
    );
    $obj = new HashRing($servers);
    $servers = $obj->getServersByKey('testkey', 2);
    print_r($servers);
    echo "\n";
    
    

    运行结果:

    Array
    (
        [0] => 127.0.0.1:11214
        [1] => 127.0.0.1:11211
    )

    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哈希表实现算法原理解析
    • PHP实现的一致性哈希算法完整实例
    • PHP内核探索:哈希表碰撞攻击原理
    • PHP中创建和验证哈希的简单方法实探
    • php内核解析:PHP中的哈希表
    • php-perl哈希算法实现(times33哈希算法)
    • PHP 5.5 创建和验证哈希最简单的方法详解
    • 一致性哈希算法以及其PHP实现详细解析
    • 如何用PHP实现分布算法之一致性哈希算法
    上一篇:PHP检查端口是否可以被绑定的方法示例
    下一篇:PHP实现十进制数字与二十六进制字母串相互转换操作示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP实现的服务器一致性hash分布算法示例 PHP,实现,的,服务器,一致性,