美文网首页PHP经验分享PHP那些事儿
php哈希分表过程中出现大整型数据溢出问题的解决

php哈希分表过程中出现大整型数据溢出问题的解决

作者: 散漫二丫 | 来源:发表于2018-05-22 11:49 被阅读15次

背景:
python脚本监控数据进行哈希分表,方案如下:

    ```
        def gethashcode(str):
              import hashlib
              m = hashlib.md5()
              m.update(str)
              hashcode = m.hexdigest()
              return int(hashcode, 16)
    ```

如上脚本哈希分表,key落入哪个分表,获取的时候就从哪个分表取出。后台PHP在实现匹配分表时要翻译实现python的哈希分表方案。最初方案如下:

      ```
        function gethashcode($k)
        {
            $hashcode = md5($k);//获取32为16进制字符串
            return hexdec($hashcode);//将16进制字符串转为十进制数字
         }

      ```

如上PHP实现内容会出现PHP大整型数据溢出问题,最后对table_nums进行取模的时候会发生异常。改良原理如下:

      ```
      如果用一个int 型数据保存. 逐步解释每一个字符乘以16^n的值再累加, 把字符串转化成数字 再 mod 10的话,会存在溢出的      问题, 所以这种思路不太好.
      自己能想到最好的办法是这样的:读出每一个字符对应的于0~15的值(除最后一位)累加乘以6,再加上最后一位的值. 之后再 mod10 即是最终所求的余数..
      原理:16^n = 10*k +6 (n,k为正整数,且n>=1) 这个式中显然成立.. 因此 (16^n)mod(10) = (10*k + 6)mod(10) = 6(n,k为正整数,且n>=1).
       因此除最后一位的数.都可以直接简化为乘以6,再加了最后一位的值. 最后mod 10即可.
       示例: 比如 0x58fd7 mod 10 = ?
       直接口算易知:(5 + 8 + 15 + 13)* 6 + 7 的结果mod10 为 3 。。 有此方法上面的式中很长都可以很快口算出来.何况用编程for循环呢..

      ```

以上原理参考文章:https://blog.csdn.net/w_sx12553/article/details/17526917
原理对应方案:

      ```
       function gethashcode($k)
        {
              $m16 = md5($k);
              $m10 = 0;
              for ($i=0; $i < strlen($m16); $i++) { 
                    if($i == strlen($m16)-1) break;
                    $m10 += hexdec($m16[$i]);
               }
               $m10 = $m10*6+hexdec($m16[$i]);
               return $m10;
      }

      

      $mod = $m10%table_nums;
      ```

over~

相关文章

  • php哈希分表过程中出现大整型数据溢出问题的解决

    背景:python脚本监控数据进行哈希分表,方案如下: 如上脚本哈希分表,key落入哪个分表,获取的时候就从哪个分...

  • [PHP面试必看:BAT招聘PHP程序员,曾经问过的10个PHP

    【1】PHP的整型溢出问题是怎样的?PHP的整型数的字长和平台有关,对于32位的操作系统,最大的整型是有二十多亿,...

  • HashMap 1.7 死循环分析

    数据结构 HashMap 使用哈希表也叫散列表来存储数据的,哈希表为解决冲突,可以采用开放地址法、链地址法等来解决...

  • 分库分表

    数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。 分库分表目前有很多的中间...

  • 算法(5)哈希表

    1.0 问题描述 实现数据结构:哈希表。 2.0 问题分析 哈希表可以看作我们经常使用的字典(swift)或对象(...

  • hive解决数据倾斜应知应会(2020-03-10)

    解决数据倾斜问题 join 小表join大表使用mapjoin 大表join大表使用skewinjoin null...

  • 【MySQL学习】No.3 SQL索引

    索引的出现是为了提高查询效率,常用的主要包含三种数据结构:哈希表、有序数组和搜索树。 哈希表 哈希表是一种以键 -...

  • 分布式系统技术原理 - 一致性(1)

    最近工作中,在解决配送核心系统的一个热点问题。为了问题解决,需要对核心业务数据库进行散表/拆表优化。过程中,发现大...

  • 【三】哈希表

    前言 哈希表基本上是我见过使用最广泛的数据结构了,不管是PHP,MySQL,Redis,JAVA等,都使用到了哈希...

  • PHP7之数组

    前言 本文主要简单介绍一下PHP7数组的数据结构哈希表,阅读本文前,您需要掌握基础的C/C++的知识以及对哈希表的...

网友评论

    本文标题:php哈希分表过程中出现大整型数据溢出问题的解决

    本文链接:https://www.haomeiwen.com/subject/vfjhjftx.html