2012-01-17 51 views
1

此問題類似於: How to get a 64 bit integer hash from a string in PHP?在PHP中將md5摘要的前64位計算爲整數?

我有這個JAVA功能。我想在PHP中具有相同的功能。感謝

/** 
* returns the first 64 bits of the md5 digest as a long 
*/ 
public static long get64BitMD5(String text) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(text.getBytes(UTF_8)); 
     byte [] digest = md.digest(); 
     long ret = 0; 
     for (int i = 0; i < 8; i++) 
      ret = (ret<<8)|(((long)digest[i])&0xFFl); 
     return ret; 
    } catch (NoSuchAlgorithmException e) { 
     throw new RuntimeException(e); 
    } 
} 

回答

1

這是可能的使用bcmath加上一些擴展從評論接受的答案在這裏:Using bit operations on 64 bits integers in 32 bit systems (no php_gpm extension)。您還需要從這裏獲得bchexdec()函數:http://www.php.net/manual/en/ref.bc.php#99130

因此,如果包含可在http://www.nirvani.net/software/bc_bitwise/bc_bitwise-0.9.0.inc.php.asc處找到的內容,則可以使用以下函數。

function get64BitMD5($stringToHash) { 
    $hash = md5($stringToHash, true); 
    $ret = '0'; 
    for ($i = 0; $i < 8; $i++) { 
     $char = substr($hash, $i, 1); 
     $ret = bcmul($ret, '256'); // (ret<<8) 
     $tmp = unpack('c', $char); 
     $tmp = $tmp[1] & 0xFF; 
     $ret = bcor($ret, $tmp); // bitwise OR (| op) 
    } 

    if (bccomp($ret, '9223372036854775807') == 1) { // > 0x7FFFFFFFFFFFFFFF 
     $ret = bcsub($ret, bchexdec('10000000000000000')); 
    } 

    return $ret; 
} 
1

不能在基地PHP這樣做,因爲PHP沒有64位整數類型(echo PHP_INT_SIZE確認)。它可能有64位有符號整數類型,如果您正在x64堆棧上運行,但不能保證。

有擴展可以提供任意大小的整數類型,但如果要執行按位算術,這些擴展將會很難使用。

你想完成什麼?當然,還有其他一些方法可以實現您的目標。

+0

64位PHP確實有64位有符號整數,而不是64位無符號整數...但它是可以計算的64位字節流 – 2012-01-17 00:30:46

+0

@MarkBaker:這是[瑣碎]( http://www.php.net/manual/en/function.pack.php)將'md5'的十六進制輸出轉換爲原始字節,如果這是OP想要的。唯一的問題是他們沒有告訴。 – Jon 2012-01-17 00:34:05