java大文件md5快速计算_java 计算文件MD5值 大文件
MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性。用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm)。另外还有一种常用的消息摘要算法SHA1。如果想了解这些的话,可以去百度百科:MD5、SHA1、消息摘要算法。
Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果。
1.字符串的MD5(下面的代码有详细注释)
public static String stringMD5(String input) {
try {
// 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
MessageDigest messageDigest =MessageDigest.getInstance("MD5");
// 输入的字符串转换成字节数组
byte[] inputByteArray = input.getBytes();
// inputByteArray是输入字符串转换得到的字节数组
messageDigest.update(inputByteArray);
// 转换并返回结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest();
// 字符数组转换成字符串返回
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
//下面这个函数用于将字节数组换成成16进制的字符串
public static String byteArrayToHex(byte[] byteArray) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
if (n < b.length - 1) {
hs = hs + "";
}
}
// return hs.toUpperCase();
return hs;
// 首先初始化一个字符数组,用来存放每个16进制字符
/*char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };
// new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
char[] resultCharArray =new char[byteArray.length * 2];
// 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
int index = 0;
for (byte b : byteArray) {
resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];
resultCharArray[index++] = hexDigits[b& 0xf];
}
// 字符数组组合成字符串返回
return new String(resultCharArray);*/
}
从上面代码可以看出,使用MessageDigest对字符串进行MD5算法的步骤是,先将字符串转换成字节数组,在进行MD5算法,最后返回的也是一个字节数组,要我们自己转成32位的字符串。
2.文件MD5
对文件进行MD5也可以像字符串MD5一样的,首先要把文件转成字节数组,后面和字符串MD5完全一样。
但是如果是一个特别大的文件,一下子把一个文件的数组全部读到内存中,那么估计内存也吃不消。
对于大文件,可以使用DigestInputStream。
public static String fileMD5(String inputFile) throws IOException {
// 缓冲区大小(这个可以抽出一个参数)
int bufferSize = 256 * 1024;
FileInputStream fileInputStream = null;
DigestInputStream digestInputStream = null;
try {
// 拿到一个MD5转换器(同样,这里可以换成SHA1)
MessageDigest messageDigest =MessageDigest.getInstance("MD5");
// 使用DigestInputStream
fileInputStream = new FileInputStream(inputFile);
digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
// read的过程中进行MD5处理,直到读完文件
byte[] buffer =new byte[bufferSize];
while (digestInputStream.read(buffer) > 0);
// 获取最终的MessageDigest
messageDigest= digestInputStream.getMessageDigest();
// 拿到结果,也是字节数组,包含16个元素
byte[] resultByteArray = messageDigest.digest();
// 同样,把字节数组转换成字符串
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException e) {
return null;
} finally {
try {
digestInputStream.close();
} catch (Exception e) {
}
try {
fileInputStream.close();
} catch (Exception e) {
}
}
}
上面的方法本人亲测过大小约4G的文件,得出的MD5值和网上下载的一个MD5小工具得到的MD5值一样,说明上面的方式没有什么问题。不过取大文件的MD5很慢,4G的文件跑一下要一分钟(I5处理器 6G内存 64位XP系统 本本)。
附1:我在网上还看到一种给文件MD5的方式
[java]
public static String getFileMD5String(File file) throws IOException{
FileInputStream in = new FileInputStream(file);
FileChannel ch =in.getChannel();
MappedByteBuffer byteBuffer =ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length());
messagedigest.update(byteBuffer);
return byteArrayToHex (messagedigest.digest());
}
我也尝试过这样的方式,但是如果文件大于2G,那么这种方式会出现异常。所以不推荐。
附2:测试文件MD5的main方法
[java]
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
try {
System.out.println(fileMD5("E:/软件/VS2008ProEdition90DayTrialCHSX1435983.iso"));
} catch (IOException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)/1000);
}
java大文件md5快速计算_java 计算文件MD5值 大文件相关推荐
- java中微秒时间相减_Java计算时间差(两个时间相减)
在Android开发或者Java学习中,经常要求两个时间差 比如说: 现在是 :2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式 ...
- java file 相对路径 根目录修改_java中使用相对路径读取文件的写法总结 ,以及getResourceAsStream() (转)...
https://blog.csdn.net/my__sun_/article/details/74450241 读取文件的写法,相对路径 在当前的目录结构中读取test.txt的有四种写法 简单粗暴的 ...
- java中找不到文件是什么情况_java系统找不到指定文件怎么办
系统找不到指定文件解决方法如下:目录路径太长,这个文件找不到,是因为目录路径太长,windows识别不了这么长的目录,首先,这个目录上级目录已经是windows的.2.检查文件路径是否正确 3.另外, ...
- java 输出大于n的质数_Java 计算并打印第n个质数
小编典典 为了计算第n个素数,我知道两个主要的变体. The straightforward way 也就是说,从找到的所有素数开始计数,直到找到所需的n th为止. 可以使用不同级别的复杂性和效率来 ...
- Java拆解最多的素数之和_java - 计算并打印第n个素数 - 堆栈内存溢出
为了计算第n个素数,我知道两个主要的变体. 直截了当的方式 也就是说,从找到的所有素数开始计数,直到找到所需的n th为止. 这可以通过不同程度的复杂性和效率来完成,并且在概念上有两种不同的实现方式. ...
- java 年计算_JAVA计算年/周的问题
靠!最近有这个需求,把我郁闷的要死!!花了好几天了还是没有满意的结果,看来还得研究JDK自己的东东啊,没有根基,哪来的大厦? 终于还是看到了tag的文章,很感谢他! shit!我真的费了好大的劲,结果 ...
- 大数据中位数怎么运算_java 计算中位数的实现方法
最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个 先说说什么是中位数: 中位数就是中间的那个数, 如果一个集合是奇 ...
- JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...
[任务一]:编写一个简单 Java 程序,计算银行年存款的本息. 要求:程序运行后要求用户输入存款本金.年利率和存款年限,最后程序计算并输出相应年限后存款的金额.相应 的计算公式为:存款总额=本金 * ...
- java某个时间推迟60天_java计算两个时间相差(天、小时、分钟、秒)
public static long dateDiff(String startTime, String endTime, String format, String str) { // 按照传入的格 ...
- java获取页面点击次数_java计算鼠标点击次数的题,急求!
展开全部 我没有用到题目里给的计算时间差来计算,想不明白有啥用. 另外我就没布局了,随便做了个界面美化32313133353236313431303231363533e58685e5aeb931333 ...
最新文章
- 看不到日志_Kubernetes中常用的日志收集方案
- linux发送http请求xml报文,使用curl命令行发送/发布xml文件
- OpenCV中像素逻辑运算:逻辑非运算
- 【JFreeChart】JFreeChart—输出时序图
- SAP Spartacus里使用injection token提供默认配置的一个例子
- 计算机编程输入与输出,计算机编程语言的发展与输入输出设备的使用
- ZOJ 1057 Undercut(简单模拟)
- classpath目录
- nginx 二级目录 php,nginx两个tp程序一个放到二级目录下,我们要如何访问
- 重置物体的position, rotation, scale,复制物体的组件
- 数据库表的建立与基本操作
- el-select 下拉框样式修改
- 电商自营藏猫腻 苏宁国美京东的套路谁最深?
- Program Slicing
- PVE系列教程(十五)、安装Windows10系统(专业版、企业版、家庭版通用)
- 了解一下Go中的“sb“代码?
- 春秋战国开局名臣搭配推荐
- 嵌入式BootLoader技术内幕
- Win10系统 格式化分配单元大小的解释与分配方法
- 防火墙虚拟化技术详解(上)