有没有一种方法在Java中生成字符串的MD5哈希值?
MessageDigest
类可以为您提供MD5摘要的实例。
在使用字符串和加密类时,请务必始终指定要使用的字节表示的编码方式。如果仅使用string.getBytes()
,它将使用平台默认值。(并非所有平台都使用相同的默认值)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] theMD5digest = md.digest(bytesOfMessage);
如果您有很多数据,请查看可以重复调用的.update(xxx)
方法。然后调用.digest()
以获得结果哈希值。yourString.getBytes(StandardCharsets.UTF_8)
。这可以避免处理UnsupportedEncodingException
异常。 - Hummeling Engineering BV您需要使用java.security.MessageDigest
。
调用MessageDigest.getInstance("MD5")
以获取MessageDigest
的MD5实例,您可以使用它。
通过以下方式之一计算哈希值:
byte[]
提供,并使用 md.digest(bytes)
一次性计算哈希。md.update(bytes)
一次提供一个byte[]
块到MessageDigest
中。当您添加完输入字节时,使用md.digest()
计算哈希。md.digest()
返回的byte[]
是MD5哈希。
MessageDigest
允许您分块输入数据。这是静态方法所无法实现的。虽然您可以争论他们应该添加一个静态方法以便在一次性传递所有数据时更加方便。 - user253751String 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;
}
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
,而不是使用while
循环。这样的话,编辑器就不会警告您在循环内执行字符串连接操作了。 - tom您可能还想查看Apache commons codec项目的DigestUtils类,该类提供非常方便的方法来创建MD5或SHA摘要。
发现了这个:
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
在下面的网站上,我不为此承担任何责任,但这是一个可行的解决方案!对于我来说,许多其他代码都无法正常工作,最终导致哈希值中缺少了0。这个解决方法似乎与PHP相同。
来源:http://m2tec.be/blog/2010/02/03/java-md5-hex-0093getBytes()
时应明确指定字符编码,否则您的代码在不同平台或用户设置下会导致不同的结果。 - Paŭlo Ebermannbyte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
- Richard我发现这是最清晰简洁的方法:
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
我使用它的方法如下:
final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
final String result = new String(Hex.encodeHex(resultByte));
Hex是指:org.apache.commons.codec.binary.Hex
,来自Apache Commons项目。
String result = Hex.encodeHexString(resultByte);
。 - bluishString Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
就是这样了。
不需要把它弄得太复杂。
DigestUtils 运行良好,并且在使用 md5
哈希时让您感到舒适。
DigestUtils.md5Hex(_hash);
或者DigestUtils.md5(_hash);
你可以使用其他加密方法,例如sha
或md
。
找到了一个更加简洁的解决方案,可以从MD5哈希中获取字符串表示形式。
import java.security.*;
import java.math.*;
public class MD5 {
public static void main(String args[]) throws Exception{
String s="This is a test";
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(s.getBytes(),0,s.length());
System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
}
}
这段代码是从这里提取出来的。
String.format("%032x", new BigInteger(1, hash));
其中'hash'是散列的byte[]。 - Heshan Perera