2014-03-02 47 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