私はそれがどのように機能するか理解していますが、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();
}
これを試して
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]));
}
}
あなたはそれをより少なく書くことができます:
String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
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")))
Apache Commons Codecライブラリを使用することもできます。このライブラリには、DigestUtils
クラスのメソッドpublic static String md5Hex(InputStream data)
およびpublic static String md5Hex(byte[] data)
が含まれています。これを自分で発明する必要はありません;)
最初に、MessageDigest
の_byte[]
_出力を取得する必要があります。
_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();
_
バイト配列では、メッセージダイジェストの結果:
...
byte hashgerado[] = md.digest(entrada);
...
for(byte b : hashgerado)
System.out.printf("%02x", Byte.toUnsignedInt(b));
結果(例):
89e8a9f68ad3c4bba9b9d3581cf5201d
/**
* 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;
}
ご参考までに...
特定の状況では、これはうまくいきませんでした
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();
最短の方法:
String toMD5(String input) {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] raw = md.digest(input.getBytes());
return DatatypeConverter.printHexBinary(raw);
}
例外を処理することを忘れないでください。
hash.digest()
を呼び出してプロセスを終了します。バイトの配列を返します。
Stringコンストラクタを使用してbyte[]
からStringを作成できますが、16進数の文字列が必要な場合は、バイト配列を手動でループして文字を処理する必要があります。