在Java中是否有任何方法可以生成一个字符串的MD5哈希?
当前回答
另一种实现:Java中的快速MD5实现
String hash = MD5.asHex(MD5.getHash(new File(filename)));
其他回答
import java.security.*;
import javax.xml.bind.*;
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytesOfDigest = md.digest(bytesOfMessage);
String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase();
我只是下载了common -codec.jar,得到了完美的php,比如md5。这是手册。
只需将其导入到您的项目并使用即可
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
结果出来了。
Spring中也有一个DigestUtils类:
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html
这个类包含md5DigestAsHex()方法来完成这项工作。
通过使用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哈希值。
我不知道这与阅读这篇文章的人是否相关,但我只是遇到了我想要解决的问题
从给定的URL下载文件和 将其MD5值与已知值进行比较。
我希望只使用JRE类(没有Apache Commons或类似的类)。我在网上快速搜索了一下,并没有看到同时执行这两项任务的示例代码片段,只是分别执行了每项任务。因为这需要读取相同的文件两次,所以我认为有必要编写一些代码来统一这两个任务,在下载文件时实时计算校验和。这是我的结果(如果它不是完美的Java,很抱歉,但我猜你已经明白了):
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.security.DigestOutputStream; // new
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
void downloadFile(String fromURL, String toFile, BigInteger md5)
throws IOException, NoSuchAlgorithmException
{
ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());
MessageDigest md5Digest = MessageDigest.getInstance("MD5");
WritableByteChannel out = Channels.newChannel(
//new FileOutputStream(toFile)); // old
new DigestOutputStream(new FileOutputStream(toFile), md5Digest)); // new
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1 MB
while (in.read(buffer) != -1) {
buffer.flip();
//md5Digest.update(buffer.asReadOnlyBuffer()); // old
out.write(buffer);
buffer.clear();
}
BigInteger md5Actual = new BigInteger(1, md5Digest.digest());
if (! md5Actual.equals(md5))
throw new RuntimeException(
"MD5 mismatch for file " + toFile +
": expected " + md5.toString(16) +
", got " + md5Actual.toString(16)
);
}
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap