JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

php版的java-hashCode php java go

wys521 2024-11-08 15:05:17 精选教程 26 ℃ 0 评论

由于数据库中查询索引为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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表