在PHP中计算散列在本地和测试环境中产生不同的结果

Computing hash in PHP yields different results on local and test environments.

本文关键字:结果 测试环境 计算 PHP      更新时间:2023-09-26

我试图在服务器端验证客户端生成的散列。

我的客户端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版本测试PHP为5.3.3版本

为什么我得到不同的结果?

您可以使用这个函数将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

我不确定是否有更好的方法来进行转换