首页->正文

php版的java-hashCode

2012-09-24 -Web开发 标签: php

由于数据库中查询索引为java版的字符串的hashCode,所以考虑如何由php来生成这个值,以用来优化查询。
先搜索下java版本的hashCode实现方法
http://mindprod.com/jgloss/hashcode.html#STRING
也可以看下本地java的文件。 例如我本地的在D:\Program Files\Java\jdk1.7.0\src.zip解开后看里面的
\src\java\lang\String.java的hashCode方法
public int hashCode() {
     int h = hash;
     if (h == 0 && count > 0) {
          int off = offset;
          char val[] = value;
          int len = count;

          for (int i = 0; i < len; i++) {
               h = 31*h + val[off++];
          }
          hash = h;
     }
     return h;
}

里面有些变量是创建对象时初始化的(java new的时候是多态的,得看那个字符串类型的,java真强大……)
public String(char value[]) {
    int size = value.length;
    this.offset = 0;
    this.count = size;
    this.value = Arrays.copyOf(value, size);
}

接着就直接转换为php,要注意的是java的int类型是含有符号的,所以要强制转为php的int型。
<?php
function hashCode($s){
     $len = strlen($s);
     $hash = 0;
     for($i=0; $i<$len; $i++){
          //一定要转成整型
          $hash = (int)($hash*31 + ord($s[$i]));
     }
     return $hash;
}

//EOF

貌似很正常,但放到64位的机器下就有问题了。
由于64位下php int最大值为9223372036854775807
可以通过php -r "echo PHP_INT_MAX;"查看
而32为下是2147483647
所以要强制转为一下,这时候要理解下整形的表示方法,带符号的32bit整形第32bit为符号位:0即为正数 1则为负数,是1的要转换为负数,负数的转换上也要注意下,32bit下最小的负数是-2147483648,随着数的递增而变大,直到0,再到正数的最大值,再循环到负数……
<?php
function hashCode($s){
     $len = strlen($s);
     $hash = 0;
     for($i=0; $i<$len; $i++){
          //一定要转成整型
          $hash = (int)($hash*31 + ord($s[$i]));
          //64bit下判断符号位
          if(($hash & 0x80000000) == 0) {
               //正数取前31位即可
               $hash &= 0x7fffffff;
          }
          else{
               //负数取前31位后要根据最小负数值转换下
               $hash = ($hash & 0x7fffffff) - 2147483648;
          }
     }
     return $hash;
}
//EOF

位运算相关介绍见之前的文章

下一篇 还没写(:

上一篇 通过curl实现远程文件下载

相关文章

Ubuntu下编译安装PHP

使用curl_multi_init并发请求

php增加Last-Modified为何无效

用xhprof分析php代码

正则修饰符m和s用法

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com