2014-03-02 24 views
0

我在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); 
} 
+1

有没有你不能使用较为规范的哈希算法的好理由如SHA-256? – mwrichardson

+0

不幸的是,这不是我的选择。 – Interfector

回答

1

移位运算符的行为在PHP编译为64个不同的,因为你在32位有0xFFFFFFFFFFFF而不是0xFFFFFFFF一个PHP_MAX_INT值。

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; 
     } 
} 
+0

我试过,结果如下 32位的一个简单的测试:INT(87860732)<< 10 => INT(-224923648) 64:lshift32(INT(87860732),10)=> INT(4070043668) 你能确认这一点,菲利普? – Interfector

+0

有迹象(和我实施了lsh ..)代码更新有一些问题 – Philipp

0

在我的情况的解决方法是使用下面的函数代替intval

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

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

    return $value; 
} 

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