2012-01-17 1 views
1

この問題は次のようなものです。 How to get a 64 bit integer hash from a string in PHP?md5ダイジェストの最初の64ビットをPHPで整数として計算しますか?

私はこのJAVA機能を持っています。私はPHPで同じ機能を持っていたいと思います。 PHPは何の64ビット整数型(確認のためecho PHP_INT_SIZE)を持っていないので、感謝

/** 
* 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))を使用して可能です。あなたはhttp://www.nirvani.net/software/bc_bitwise/bc_bitwise-0.9.0.inc.php.ascで見つけることができるものなどがあれば、あなたは次の関数を使用することができ、そうhttp://www.php.net/manual/en/ref.bc.php#99130

:あなたもここからbchexdec()機能が必要になります。 (これは、[些細]である:

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でこれを行うことはできません。 は64ビットの符号付き整数型を持っていますが、x64スタックで実行している場合は保証されません。

任意のサイズの整数型を提供する拡張機能がありますが、ビット単位の算術演算を実行する場合は扱いにくくなります。

あなたは何を達成しようとしていますか?確かにあなたの目標を達成するための他の方法があります。

+0

64ビットのPHPは、64ビットの符号なし整数64ビット符号付き整数を有するのではなく... –

+0

@MarkBakerバイトストリーム64ビットを算出することも可能ですhttp://www.php.net/manual/en/function.pack.php)OPの望むものなら、 'md5'の16進数の出力を生のバイトに変換します。唯一の問題は、彼らが話していないということです。 – Jon

関連する問題