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

我希望在 32 位的 64 位系统上获得相同的结果,值为 -951649475,请帮助我...谢谢,对不起,我的英语不好...

4

1 回答 1

0

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

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

如果您删除了& 0xFFFFFFFF在 64 位系统上导致问题的那个(并且对 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;
}
于 2013-03-10T00:02:57.237 回答