35

どのように機能するかは理解していますが、MD5 を文字列として出力したい場合はどうすればよいですか?

public static void getMD5(String fileName) throws Exception{
    InputStream input =  new FileInputStream(fileName);
    byte[] buffer = new byte[1024];

    MessageDigest hash = MessageDigest.getInstance("MD5");
    int read;
    do {
        read = input.read(buffer);
        if (read > 0) {
            hash.update(buffer, 0, read);
        }
    } while (read != -1);
    input.close();
}
4

11 に答える 11

79

あなたはそれをより少なく書くことができます:

String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
于 2012-09-20T14:06:29.263 に答える
26
    String input = "168";
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5sum = md.digest(input.getBytes());
    String output = String.format("%032X", new BigInteger(1, md5sum));

また

DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))
于 2011-03-29T09:16:32.047 に答える
23

これを試して

StringBuffer hexString = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest();

for (int i = 0; i < hash.length; i++) {
    if ((0xff & hash[i]) < 0x10) {
        hexString.append("0"
                + Integer.toHexString((0xFF & hash[i])));
    } else {
        hexString.append(Integer.toHexString(0xFF & hash[i]));
    }
}
于 2011-03-29T09:15:39.870 に答える
23

Apache Commons Codec ライブラリも使用できます。このライブラリには、メソッドpublic static String md5Hex(InputStream data)とクラスが含まpublic static String md5Hex(byte[] data)れています。DigestUtilsこれを自分で発明する必要はありません ;)

于 2011-03-29T09:20:15.090 に答える
9

まず、 :のbyte[]出力を取得する必要があります。MessageDigest

byte[] bytes = hash.digest();

ただし、これは(たとえば)で簡単に印刷することはできませんnew String(bytes)。これは、適切な出力表現を持たないバイナリが含まれるためです。ただし、次のように表示するために16進数に変換できます。

StringBuilder sb = new StringBuilder(2 * bytes.length);
for (byte b : bytes) {
    sb.append("0123456789ABCDEF".charAt((b & 0xF0) >> 4));
    sb.append("0123456789ABCDEF".charAt((b & 0x0F)));
}
String hex = sb.toString();
于 2011-03-29T09:15:25.770 に答える
3

バイト配列を使用すると、メッセージ ダイジェストの結果が得られます。

...
byte hashgerado[] = md.digest(entrada);
...

for(byte b : hashgerado)
    System.out.printf("%02x", Byte.toUnsignedInt(b));

結果 (例):
89e8a9f68ad3c4bba9b9d3581cf5201d

于 2016-05-20T04:28:06.433 に答える
2
/**
 * hashes:
 * e7cfa2be5969e235138356a54bad7fc4
 * 3c9ec110aa171b57bb41fc761130822c
 *
 * compiled with java 8 - 12 Dec 2015
 */
public static String generateHash() {
    long r = new java.util.Random().nextLong();
    String input = String.valueOf(r);
    String md5 = null;

    try {
        java.security.MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
        //Update input string in message digest
        digest.update(input.getBytes(), 0, input.length());
        //Converts message digest value in base 16 (hex)
        md5 = new java.math.BigInteger(1, digest.digest()).toString(16);
    }
    catch (java.security.NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5;
}
于 2015-12-10T19:35:27.547 に答える
2

ご参考までに...

特定の状況では、これはうまくいきませんでした

md5 = new java.math.BigInteger(1, digest.digest()).toString(16);

しかし、これはした

StringBuilder sb = new StringBuilder();

for (int i = 0; i < digest.length; i++) {
    if ((0xff & digest[i]) < 0x10) {
        sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
    } else {
        sb.append(Integer.toHexString(0xFF & digest[i]));
    }
}

String result = sb.toString();
于 2016-02-27T00:32:31.143 に答える
-1

hash.digest()プロセスを終了するために呼び出します。バイトの配列を返します。

Stringコンストラクターを使用してからStringを作成できますがbyte[]、16進文字列が必要な場合は、バイト配列を手動でループして文字を計算する必要があります。

于 2011-03-29T09:14:43.150 に答える
-1

これは @anything 回答の別のバージョンです。

StringBuilder sb = new StringBuilder();

for (int i = 0; i < digest.length; i++) {
    if ((0xff & digest[i]) < 0x10) {
        sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
    } else {
        sb.append(Integer.toHexString(0xFF & digest[i]));
    }
}

String result = sb.toString();
于 2014-11-14T14:25:41.907 に答える