首页 » PHP教程 » phpint64技巧_php版的javahashCode

phpint64技巧_php版的javahashCode

访客 2024-11-09 0

扫一扫用手机浏览

文章目录 [+]

先搜索下java版本的hashCode实现方法

http://mindprod.com/jgloss/hashcode.html#STRING

phpint64技巧_php版的javahashCode

也可以看下本地java的文件。
例如我本地的在D:\Program Files\Java\jdk1.7.0\src.zip解开后看里面的

phpint64技巧_php版的javahashCode
(图片来自网络侵删)

\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 = 31h + 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型。

<?phpfunction hashCode($s){$len = strlen($s);$hash = 0;for($i=0; $i<$len; $i++){//一定要转成整型$hash = (int)($hash31 + 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,再到正数的最大值,再循环到负数……

<?phpfunction hashCode($s){$len = strlen($s);$hash = 0;for($i=0; $i<$len; $i++){//一定要转成整型$hash = (int)($hash31 + ord($s[$i]));//64bit下判断符号位if(($hash & 0x80000000) == 0) {//正数取前31位即可$hash &= 0x7fffffff;}else{//负数取前31位后要根据最小负数值转换下$hash = ($hash & 0x7fffffff) - 2147483648;}}return $hash;}//EOF

标签:

相关文章