web-dev-qa-db-ja.com

Java MD5ハッシュを計算する

http://www.anyexample.com/programming/Java/java_simple_class_to_compute_md5_hash.xml では、StringのMD5ハッシュを計算する方法の例が示されています。これにより、20桁の16進数文字列になります。 http://en.wikipedia.org/wiki/MD5 によると、32桁の16進数文字列が必要です。 MD5ハッシュを生成するにはどうすればよいですか? で、たとえばdac2009応答を使用して同じ結果が得られます。

MD5ハッシュのように見えるのに、そうではないのはなぜですか?取得するすべての文字列に12個の先行ゼロを埋め込む必要があるとは思えません。

編集:1つのコード例

public static String MungPass(String pass) throws NoSuchAlgorithmException {
    MessageDigest m = MessageDigest.getInstance("MD5");
    byte[] data = pass.getBytes(); 
    m.update(data,0,data.length);
    BigInteger i = new BigInteger(1,m.digest());
    return String.format("%1$032X", i);
}

http://snippets.dzone.com/posts/show/3686 から取得

13
AndyAndroid

あなたは何かを逃しているに違いありません。リンクされたコードは問題ありません。結果の表示に関連する問題が他にないことを確認してください。可能性:

  • gUIで小さすぎる
  • マルチスレッドの問題があるコンソール
  • 間もなく切断されるネットワークパッケージを介して
  • 長さを20ではなく0x20にカットします。これは32です。
4

使用する org.Apache.commons.codec.digest.DigestUtils代わりに:

DigestUtils.md5Hex(str);

これにより、結果として32文字の文字列が得られます

46
tsds

上記の例であるMungPass( "Java")を試したところ、32桁の文字列93f725a07423fe1c889f448b33d21f46が得られました。実行したときに最初の20が正しかったので、出力に何か欠けていると思いますか?

1
dac2009

DatatypeConverter.printHexBinary(digiest)を使用して、32桁の16進数で表される128ビットのハッシュを取得できます。以下は、Javaで MD5ハッシュを生成 への完全なコードスニペットです。

import Java.security.MessageDigest;
import Java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

public class MD5HashGenerator 
{

public static void main(String args[]) throws NoSuchAlgorithmException
{
    String stringToHash = "MyJavaCode"; 
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.update(stringToHash.getBytes());
    byte[] digiest = messageDigest.digest();
    String hashedOutput = DatatypeConverter.printHexBinary(digiest);
    System.out.println(hashedOutput);
}
}
1
Prasanna L M