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

Php 如何将64位整数的值均衡到32位,php,integer,64-bit,32-bit,Php,Integer,64 Bit,32 Bit,我想在64位和32位系统中匹配整数的值,这是我的PHP脚本的一个示例 function integer_hash_aritmathic ($value) { $maxVal = 2147483647 & 0xFFFFFFFF; $minVal = -2147483648 & 0xFFFFFFFF; $hash = 0; for ($i = 0; $i < strlen($value); $i++) {

我想在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');
函数整数\u散列\u算术($value)
{       
$maxVal=2147483647&0xFFFFFFFF;
$minVal=-2147483648&0xFFFFFFFF;
$hash=0;
对于($i=0;$i$maxVal)$hash=$hash+$minVal-$maxVal-1;
如果($hash<$minVal)$hash=$hash+$maxVal-$minVal+1;
}
返回值(int)$hash;
}
回显整数散列算术('21512510');
32位系统中的输出: -951649475

64位系统中的输出: 128324357029


我想在64位32位系统上得到相同的结果,值为-951649475,请帮助我。。。谢谢,我很抱歉我的英语不好…

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

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

如果删除导致64位系统出现问题的
&0xffffffffff
(并且对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;
}
函数整数\u散列\u算术($value){
$hash=0;
对于($i=0;$i
64位系统上$minVal的值是多少?