【问题标题】:How to equalize the value of the integer in the 64 Bit to 32 Bit如何使 64 位中的整数值等于 32 位
【发布时间】:2013-02-25 04:20:37
【问题描述】:

我想在 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,请帮助我...谢谢,对不起,我的英语不好...

【问题讨论】:

  • 在 64 位系统上 $minVal 的值是多少?

标签: php integer 64-bit 32-bit


【解决方案1】:

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

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

如果您删除在 64 位系统上导致问题的 &amp; 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多