在Java中是否有任何方法可以生成一个字符串的MD5哈希?


当前回答

通过使用java中的MessageDigest类中的方法,可以为给定的文本生成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);
   }
}

MD5函数的输出是由32个十六进制数表示的128位哈希。

如果你使用的是像MySQL这样的数据库,你也可以用一种更简单的方式来做到这一点。查询Select MD5(" text here ")将返回括号中文本的MD5哈希值。

其他回答

无论如何,我无意中发现了这一点,因为我想从一个将安装COM组件的程序的自然键合成guid;我希望进行综合,以免管理GUID生命周期。我将使用MD5,然后使用UUID类从中获取一个字符串。(http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439提出了这个问题)。

在任何情况下,java.util.UUID都可以从MD5字节中获得一个漂亮的String。

return UUID.nameUUIDFromBytes(md5Bytes).toString();

如果你不需要最好的安全性,MD5是完全可以的,如果你正在做一些像检查文件完整性这样的事情,那么安全性就不是一个考虑因素。在这种情况下,您可能希望考虑一些更简单和更快的方法,例如Adler32, Java库也支持它。

试试这个:

public static String getHashMD5(String string) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
        return bi.toString(16);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(MD5Utils.class
                .getName()).log(Level.SEVERE, null, ex);

        return "";
    }
}

使用java.security.MessageDigest库的简单函数

public String stringMD5Hash(String text) throws NoSuchAlgorithmException {
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    byte[] bytes = messageDigest.digest(text.getBytes());
    StringJoiner stringJoiner = new StringJoiner("");
    for (byte b : bytes) {
        stringJoiner.add(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3));
    }
    return stringJoiner.toString();
}

对于文件使用这个函数

public static String FileMD5Hash(File file) throws NoSuchAlgorithmException, IOException {
    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    byte[] bytes = messageDigest.digest(getFileBytes(file));
    StringJoiner stringJoiner = new StringJoiner("");
    for (byte b : bytes) {
        stringJoiner.add(Integer.toHexString((b & 0xFF) | 0x100).substring(1, 3));
    }
    return stringJoiner.toString();
}

public static byte[] getFileBytes(File file) throws IOException{
    InputStream inputStream = new FileInputStream(file);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    byte[] bytes = new byte[1024];
    int bytesRead;
    while ((bytesRead = inputStream.read(bytes)) != -1) {
        byteArrayOutputStream.write(bytes, 0, bytesRead);
    }
    return byteArrayOutputStream.toByteArray();
}

如果你真的想要返回一个字符串,而不是字节数组,你总是可以这样做:

String plaintext = "your text here";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
  hashtext = "0"+hashtext;
}