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值 大文件相关推荐

  1. java中微秒时间相减_Java计算时间差(两个时间相减)

    在Android开发或者Java学习中,经常要求两个时间差 比如说: 现在是 :2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式 ...

  2. java file 相对路径 根目录修改_java中使用相对路径读取文件的写法总结 ,以及getResourceAsStream() (转)...

    https://blog.csdn.net/my__sun_/article/details/74450241 读取文件的写法,相对路径 在当前的目录结构中读取test.txt的有四种写法 简单粗暴的 ...

  3. java中找不到文件是什么情况_java系统找不到指定文件怎么办

    系统找不到指定文件解决方法如下:目录路径太长,这个文件找不到,是因为目录路径太长,windows识别不了这么长的目录,首先,这个目录上级目录已经是windows的.2.检查文件路径是否正确 3.另外, ...

  4. java 输出大于n的质数_Java 计算并打印第n个质数

    小编典典 为了计算第n个素数,我知道两个主要的变体. The straightforward way 也就是说,从找到的所有素数开始计数,直到找到所需的n th为止. 可以使用不同级别的复杂性和效率来 ...

  5. Java拆解最多的素数之和_java - 计算并打印第n个素数 - 堆栈内存溢出

    为了计算第n个素数,我知道两个主要的变体. 直截了当的方式 也就是说,从找到的所有素数开始计数,直到找到所需的n th为止. 这可以通过不同程度的复杂性和效率来完成,并且在概念上有两种不同的实现方式. ...

  6. java 年计算_JAVA计算年/周的问题

    靠!最近有这个需求,把我郁闷的要死!!花了好几天了还是没有满意的结果,看来还得研究JDK自己的东东啊,没有根基,哪来的大厦? 终于还是看到了tag的文章,很感谢他! shit!我真的费了好大的劲,结果 ...

  7. 大数据中位数怎么运算_java 计算中位数的实现方法

    最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个 先说说什么是中位数: 中位数就是中间的那个数, 如果一个集合是奇 ...

  8. JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...

    [任务一]:编写一个简单 Java 程序,计算银行年存款的本息. 要求:程序运行后要求用户输入存款本金.年利率和存款年限,最后程序计算并输出相应年限后存款的金额.相应 的计算公式为:存款总额=本金 * ...

  9. java某个时间推迟60天_java计算两个时间相差(天、小时、分钟、秒)

    public static long dateDiff(String startTime, String endTime, String format, String str) { // 按照传入的格 ...

  10. java获取页面点击次数_java计算鼠标点击次数的题,急求!

    展开全部 我没有用到题目里给的计算时间差来计算,想不明白有啥用. 另外我就没布局了,随便做了个界面美化32313133353236313431303231363533e58685e5aeb931333 ...

最新文章

  1. 看不到日志_Kubernetes中常用的日志收集方案
  2. linux发送http请求xml报文,使用curl命令行发送/发布xml文件
  3. OpenCV中像素逻辑运算:逻辑非运算
  4. 【JFreeChart】JFreeChart—输出时序图
  5. SAP Spartacus里使用injection token提供默认配置的一个例子
  6. 计算机编程输入与输出,计算机编程语言的发展与输入输出设备的使用
  7. ZOJ 1057 Undercut(简单模拟)
  8. classpath目录
  9. nginx 二级目录 php,nginx两个tp程序一个放到二级目录下,我们要如何访问
  10. 重置物体的position, rotation, scale,复制物体的组件
  11. 数据库表的建立与基本操作
  12. el-select 下拉框样式修改
  13. 电商自营藏猫腻 苏宁国美京东的套路谁最深?
  14. Program Slicing
  15. PVE系列教程(十五)、安装Windows10系统(专业版、企业版、家庭版通用)
  16. 了解一下Go中的“sb“代码?
  17. 春秋战国开局名臣搭配推荐
  18. 嵌入式BootLoader技术内幕
  19. Win10系统 格式化分配单元大小的解释与分配方法
  20. 防火墙虚拟化技术详解(上)

热门文章

  1. virtualbox安装步骤
  2. Linux驱动学习--HCI框架及源码分析
  3. 什么是蜘蛛池?有什么作用?
  4. SolidWorks参数化设计中Excel的应用
  5. D类放大器工作原理详解
  6. 一个人如何开发一款app?(2020修改版)
  7. dz论坛php如何使用html模板,discuz自定义模板制作方法
  8. 会议一体机_多媒体会议系统方案
  9. 1型错误和2型错误_沈阳地铁1号线太原街站导向牌出现错误!
  10. 人类的历史就是一部创业史