任何人都可以帮我将这个javascript函数转换为php吗?
var t='[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
function hash (s) {
return s.split("").reduce(
function(a, b) {
return a = (a << 5) - a + b.charCodeAt(0), a & a
}, 0
).toString()
}
alert(hash(t));
&#13;
我正在尝试这个PHP脚本:
function fun($a, $b)
{
return $a = ($a << 5) - $a + ord(substr($b,0,1));// $a & $a;
}
$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
$a = str_split($v);
$r = array_reduce($a,'fun',0);
print_r($r);
答案 0 :(得分:1)
您的代码存在问题: 虽然在JS中所有数字都是64位浮点值,但是按位运算符如shift和bit,或者操作32位整数。这就是你的JS函数中发生32位整数溢出的原因,但在PHP函数中这不会发生。
修复它:你需要在PHP函数中模拟整数溢出,以实现与JS相同的输出。已经在this answer中针对不同的问题进行了此操作。
此函数需要应用于每个二元运算符。在您的情况下,{j}函数中的<<
和&
(似乎a & a
仅用于从结果中生成32位整数。)
因此返回相同哈希值的PHP函数可能如下所示:
<?php
function intval32bits($value){
$value = ($value & 0xFFFFFFFF);
if ($value & 0x80000000)
$value = -((~$value & 0xFFFFFFFF) + 1);
return $value;
}
function fun($a, $b){
return intval32bits(doOverflow32b($a << 5) - $a + ord($b[0]));
}
$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
$a = str_split($v);
$r = array_reduce($a,'fun',0);
print_r($r);
答案 1 :(得分:0)
我得到了
function fun($a, $b)
{
$a = $a & $a;
return $a = ($a << 5) - $a + ord(substr($b,0,1));// $a & $a;
}
$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
$a = str_split($v);
$r = array_reduce($a,'fun',0);
print_r($r);