我正在尝试服务器端验证在客户端生成的哈希。
我的客户端js代码如下所示:
_hash: function(value) {
var hash = 5381;
for (var i = 0; i < value.length; i++) {
hash = ((hash << 5) + hash) + value.charCodeAt(i);
}
return hash;
}
和我的服务器端PHP代码如下:
$hash = 5381;
$value = strtoupper($input);
for($i = 0; $i < strlen($value); $i++) {
$hash = (($hash << 5) + $hash) + ord(substr($value, $i));
}
当应用于字符串“FMQXXU”时,您应该在任一侧获得-1329107890。
这两个脚本在我的本地环境中完美运行, 但是当我在另一台机器上进行测试时,只有js代码有效。 php代码返回6952222944334。
本地php是版本5.3.8, test php是5.3.3版本。
为什么我会得到不同的结果?
答案 0 :(得分:1)
您可以使用此功能将64位转换为32位:
function to_32bits($val) {
$sign = 1 << 31;
return $val & ($sign) ? -(~($val & 0x7fffffff) + 1 + ($sign)) : $val & 0xffffffff;
}
示例:
$a = -1329107890;
$b = 6952222944334;
function to_32bits($val) {
$sign = 1 << 31;
return $val & $sign ? -(~($val & 0x7fffffff) + 1 + $sign) : $val & 0xffffffff;
}
echo $a . ' ' . to_32bits($b);
将输出:-1329107890 -1329107890
我不确定是否有更好的方法进行转换。