如何将64位整数的值均衡到32位?

3

我希望能够匹配64位和32位系统中整数的值,以下是我的PHP脚本示例:

function integer_hash_aritmathic ($value)
{       
    $maxVal = 2147483647 & 0xFFFFFFFF;
    $minVal = -2147483648 & 0xFFFFFFFF;
    $hash = 0;  

    for ($i = 0; $i < strlen($value); $i++)
    {
        $hash = (intval($hash) * 31) + ord($value[$i]);

        if ($hash > $maxVal) $hash = $hash + $minVal - $maxVal - 1;
        else if ($hash < $minVal) $hash = $hash + $maxVal - $minVal + 1;

    }


    return (int)$hash;
}

echo integer_hash_aritmathic ('21512510');

32位系统输出:-951649475

64位系统输出:1283243572029

我希望在64位系统上以32位的方式得到相同的结果,使用值为-951649475,请帮助我,谢谢。抱歉我的英语很差...


64位系统上$minVal的值是多少? - Terje D.
1个回答

0

您似乎正在尝试在64位系统上模拟32位溢出。

问题可能是在64位系统上,$minVal = -2147483648 & 0xFFFFFFFF会将符号位清零,将$minval的值设置为2147483648。 然后$hash = $hash + $minVal - $maxVal - 1实际上变成了$hash = $hash,并且所有计算都使用完整的整数大小。

如果您删除导致64位系统出现问题的& 0xFFFFFFFF(对32位系统没有影响),则您的代码应该可以正常工作。

另一个选择是将哈希值限制为31位,从而只得到正数。

然后可以简化代码为

function integer_hash_aritmathic ($value){       
    $hash = 0;  

    for ($i = 0; $i < strlen($value); $i++) {
        $hash = ($hash * 31 + ord($value[$i])) & 0x7FFFFFFF;               
    }

    return (int)$hash;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接