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');

32Bit システムでの出力: -951649475

64Bit システムでの出力: 1283243572029

-951649475 の値で、32 ビットの 64 ビット システムで同じ結果が必要です。助けてください... ありがとう、私の英語が下手ですみません...

4

1 に答える 1

0

64ビットシステムで32ビットオーバーフローをエミュレートしようとしているようです。

問題はおそらく、64ビットシステム$minVal = -2147483648 & 0xFFFFFFFFで符号ビットをゼロにし、$ minvalの値を2147483648に設定することです。 $hash = $hash + $minVal - $maxVal - 1その後、事実上になり$hash = $hash、すべての計算は完全な整数サイズを使用して実行されます。

64ビットシステムで問題の原因となっているを削除する& 0xFFFFFFFFと(32ビットシステムには影響しません)、コードは機能するはずです。

もう1つのオプションは、ハッシュ値を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 に答える