架构独立的算术运算

时间:2014-03-02 12:06:47

标签: php 32bit-64bit

我在PHP中有一个散列函数,它是Java散列函数的一个端口。在我的32位上,函数匹配。但是,在64位操作系统上运行PHP代码时,结果会发生变化。

无论如何,我可以独立于架构执行算术运算,就好像它们总是在32位系统上执行一样?

这是我的散列函数:

function numericHash( $text, $lessThan = 50 )
{
    $hash = 0;

    for ( $i = 0; $i < strlen( $text ); $i++ ) {
        $b = ord( $text[ $i ] );
        $hash += $b;
        $hash = intval( $hash );
        $hash += ( $hash << 10 );
        $hash = intval( $hash );
        $hash ^= ( $hash >> 6 );
        $hash = intval( $hash );
    }

    $hash += ( $hash << 3 );
    $hash = intval( $hash );
    $hash ^= ( $hash >> 11 );
    $hash = intval( $hash );

    $hash += intval( $hash << 15 );
    $hash = intval( $hash );
    return bcmod( (string) abs( $hash ), (string) $lessThan );
}

2 个答案:

答案 0 :(得分:1)

在编译为64的php上,移位运算符的行为不同,因为在32位上PHP_MAX_INT值为0xFFFFFFFFFFFF而不是0xFFFFFFFF

function lshift32($num, $steps) {
        // 64 bit
        if (PHP_INT_MAX >= 0x7FFFFFF) {
                if ($num < 0) {
                        // set 32bit signed bit
                        $num = $num | 0x80000000;
                }
                $num = ($num << $steps) & 0xFFFFFFFF;
                if (($num & 0x80000000) == 0x80000000) {
                        $num = $num | 0xFFFFFFFF00000000;
                }


                return $num;
        }
        else
        {
                return $num << $steps;
        }
}

答案 1 :(得分:0)

我的解决方案是使用以下函数代替intval

function intval32bits($value)
{
    $value = ($value & 0xFFFFFFFF);

    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);

    return $value;
}

参考:https://stackoverflow.com/a/2123458