网站首页 > 精选教程 正文
由于数据库中查询索引为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
猜你喜欢
- 2024-11-08 php还是java,选择比努力更重要! php和java区别大吗
- 2024-11-08 JAVA与PHP语言时间戳的转换问题 php时间戳转换成时间
- 2024-11-08 PHP8确认支持JIT,加上Swoole性能不输Java
- 2024-11-08 PPython 是 PHP 结合 Python 的开发技术
- 2024-11-08 arthas用的好好的,写个lambda表达式就跪了?该咋解决?
- 2024-11-08 网站建设开发语言用ASP好还是PHP好还是JAVA好?
- 2024-11-08 php使用javabridge.jar调用java代码类和方法
- 2024-11-08 php数组转换为字符串的两种方法详解「附视频」
- 2024-11-08 后端使用java还是PHP 后端用java前端用什么
- 2024-11-08 不得不懂的HTML转PDF神器,支持.NET,C ,php,java等
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)