怎么使用Java计算修改文件的MD5值
来源:亿速云
时间:2024-05-01 13:39:40 457浏览 收藏
文章小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《怎么使用Java计算修改文件的MD5值》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!
什么是 MD5 ?
MD5(Message Digest Algorithm,信息摘要算法),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。它后面这个数字 5 是因为它是为了取代 MD4 而发明的。简单的理解,它的作用就是给文件一个唯一标识。 如果我们修改了一个文件的扩展名,文件可能会打不开,但是对于 MD5 来说,并没有什么改变。所以对于一个文件,进行任何的重新命名对于md5校验都是没有用的。
MD5 的应用
这里只提几点我见过的比较频繁的应用情况。
下载文件校验
因为网络并不是完美的,下载大文件的过程中可能会出错(小文件也会,但是通常越大的文件几率越大),这是很正常的现象,网络出现波动是很正常的。所以,通常有些软件的jar或开发工具会额外提供一个文件的md5值下载(因为它很小,通常认为是不会出错的),用于用户校验文件是否下载错误。但是现在网络也是越来越好了,基本上不会错误。(所以我没有使用过,如果用户的网络环境不是很好,下载完毕一定要校验一下,免得出错。)
上传文件
相比之下,md5值上传文件的应用范围就更大了。这里主要的用途是为了文件去重和文件过滤。
文件去重
我们知道用户上传的文件中,一般都是有很多重复的,如最近流行的电影、电视剧、游戏或者其它的流行资源。其实它们占据了用户上传文件的很大一部分,所以对于同一份资源,只需要存储一份就可以了。试想一下,一万个用户(一万可能都少了)上传了同一份 4GB 的电影,那么总共需要磁盘容量:4*10000 GB。如果只是上传一份,对于其它用户的上传只是在本地计算文件的 md5值 ,如果相同就认为是同一个文件,那么就只需要 4GB 空间就足够了(当然,这里忽略了记录信息的空间大小,但是相比于文件本身的大小,这些信息还是很小的)。大家可以想一下,这样对于空间的节约是多么巨大的。
大家生活中,应该经常用到,上传一个几个 GB 的大文件,居然几秒钟就完成了,但是稍微有点网络知识的都知道,网络的上传速率是小于下载速率的(这只是对于终端用户来说),下载都达不到的速度,上传更是不可能的。所以,它应该只是进行了一个文件md5值的计算过程,根据计算的结果,如果有就不上传,只是记录一下用户拥有这个文件而已。如果没有的话,就老老实实上传,当然了,这个过程通常很慢。
文件过滤
有一些文件涉及到版权和政策的关系,是不允许用户上传的。所以,对于用户上传文件也会进行校验,然后和后台的黑名单匹配(应该是这样的),如果匹配成功的话,那么文件是无法上传或者上传的文件已经被处理掉了。这样方法的效率很高的,通常用户所谓的乱改名操作是完全没有用的。所以,用户一定要遵守政策和相关平台的规定。
修改文件的 MD5 值
一般情况下,只要改变了文件的二进制内容,文件的md5值一定会改变的。通常有利用压缩文件的方式,将多个文件压缩上传的方式,这样压缩文件的 md5值也会改变,但是有的平台也是可以解压文件的,所以这样也不是万能的。但是通过程序修改和还原文件的二进制数据还是比较容易地,使用Java的流几乎可以对与文件进行任何操作(例如对于文件的每个字节进行加密,这样想还原这个文件就是很难的,或者只是加密一段或者首先创建一个文件,先向文件写入一段固定的数字,再写入相关文件的数据,这样也是很不错的方法。)。对于文件来说,我们可以简单地把它看出是一连串连续地二进制流(逻辑上),将它合并(增加)或者截断(减少)是很简单地操作,这里就是简单的涉及文件 和 IO流的知识了。
一个简单的计算 md5 的程序
这个程序是Java网络编程上面的,这里去掉了线程,简化了一下操作,反正只是用于计算md5值,不需要用户的其它操作。
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.DigestInputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.xml.bind.DatatypeConverter; public class TestMD5 { public static void main(String[] args){ for (String filepath : args) { String md5 = computeMD5(new File(filepath)); System.out.println(md5); } } private static String computeMD5(File file) { DigestInputStream din = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); //第一个参数是一个输入流 din = new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), md5); byte[] b = new byte[1024]; while (din.read(b) != -1); byte[] digest = md5.digest(); StringBuilder result = new StringBuilder(file.getName()); result.append(": "); result.append(DatatypeConverter.printHexBinary(digest)); return result.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (din != null) { din.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } }
运行结果
修改 MD5 值
这里有两个图片,对它们进行合并,注意我这里的合并,不是通常所说的文件合并(例如合成九宫格图片),而是将文件的二进制数据合并。
先计算文件的 md5 值,注意下面的 Ahusky.jpeg 是上面的 husky.jpeg 的重命名,可以看出来对于md5值来说并没有变化,所以这是同一个文件。
然后将文件合并。
计算合并后文件的 md5 值
终于介绍完啦!小伙伴们,这篇关于《怎么使用Java计算修改文件的MD5值》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
406 收藏
-
124 收藏
-
364 收藏
-
290 收藏
-
134 收藏
-
475 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习