0

0

怎么使用Java计算修改文件的MD5值

WBOY

WBOY

发布时间:2023-05-29 08:16:45

|

2309人浏览过

|

来源于亿速云

转载

什么是 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值的计算过程,根据计算的结果,如果有就不上传,只是记录一下用户拥有这个文件而已。如果没有的话,就老老实实上传,当然了,这个过程通常很慢。

立即学习Java免费学习笔记(深入)”;

文件过滤

有一些文件涉及到版权和政策的关系,是不允许用户上传的。所以,对于用户上传文件也会进行校验,然后和后台的黑名单匹配(应该是这样的),如果匹配成功的话,那么文件是无法上传或者上传的文件已经被处理掉了。这样方法的效率很高的,通常用户所谓的乱改名操作是完全没有用的。所以,用户一定要遵守政策和相关平台的规定。

修改文件的 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;
	}
}

运行结果

怎么使用Java计算修改文件的MD5值

HIX.AI
HIX.AI

HIX.AI是一个多功能的一体化AI写作助手,集成了120多种AI写作工具,支持50多种语言,能够满足各种写作需求。

下载

修改 MD5 值

这里有两个图片,对它们进行合并,注意我这里的合并,不是通常所说的文件合并(例如合成九宫格图片),而是将文件的二进制数据合并。

怎么使用Java计算修改文件的MD5值

先计算文件的 md5 值,注意下面的 Ahusky.jpeg 是上面的 husky.jpeg 的重命名,可以看出来对于md5值来说并没有变化,所以这是同一个文件。

怎么使用Java计算修改文件的MD5值

然后将文件合并。

怎么使用Java计算修改文件的MD5值

计算合并后文件的 md5 值

怎么使用Java计算修改文件的MD5值

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

804

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

723

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

727

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

395

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16861

2023.08.03

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

0

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.1万人学习

C# 教程
C# 教程

共94课时 | 5.7万人学习

Java 教程
Java 教程

共578课时 | 39.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号