java代码获得文件的MD5

news/2025/2/12 17:32:20

目录

 

什么是文件的MD5?

java代码获得MD5的几种方式

方法一:

方法二:

方法三:

方法四:

方法五:

总结


什么是文件的MD5?

MD5是文bai件签名,相当于我们的身份du证 独一无二的。MD5在论坛上、软件发布zhi时经常用,是为了保证dao文件的正确性,防止一些人盗用程序,加些木马或者篡改版权,设计的一套验证系统。每个文件都可以用MD5验证程序算出一个固定的MD5码来。软件作者往往会事先计算出他的程序的MD5码并帖在网上。因此,在网上看到某个程序下载旁注明了MD5码时,可以把它记下来,下载了这个程序后用MD5验证程序计算你所下载的文件的MD5码,和你之前记下MD5码比较。如果两者相同,那么你所下载的是原版。如果计算出来的和网上注明的不匹配,那么你下载的这个文件不完整,或是被别人动过手脚。

java代码获得MD5的几种方式

  JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值.

方法一:

      比较原始的一种实现方法,首先将文件一次性读入内存,然后通过MessageDigest进行MD5加密,最后再手动将其转换为16进制的MD5值。

private final static String[] strHex = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public static String getMD5One(String path) {StringBuffer sb = new StringBuffer();try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));for (int i = 0; i < b.length; i++) {int d = b[i];if (d < 0) {d += 256;}int d1 = d / 16;int d2 = d % 16;sb.append(strHex[d1] + strHex[d2]);}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}

方法二:

方法二与方法一不同的地方主要是在步骤三,这里借助了Integer类的方法实现16进制的转换,比方法一更简洁一些

public static String getMD5Two(String path) {StringBuffer sb = new StringBuffer("");try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(FileUtils.readFileToByteArray(new File(path)));byte b[] = md.digest();int d;for (int i = 0; i < b.length; i++) {d = b[i];if (d < 0) {d = b[i] & 0xff;// 与上一行效果等同// i += 256;}if (d < 16)sb.append("0");sb.append(Integer.toHexString(d));}} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}

方法三:

      方法三与前面两个方法相比,在读入文件信息上有点不同。这里是分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。步骤三则是通过BigInteger类提供的方法进行16进制的转换,与方法二类似

public static String getMD5Three(String path) {BigInteger bi = null;try {byte[] buffer = new byte[8192];int len = 0;MessageDigest md = MessageDigest.getInstance("MD5");File f = new File(path);FileInputStream fis = new FileInputStream(f);while ((len = fis.read(buffer)) != -1) {md.update(buffer, 0, len);}fis.close();byte[] b = md.digest();bi = new BigInteger(1, b);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bi.toString(16);}

 

方法四:

       如果你只需要使用标准的MD5,其实一行代码就够了,JAVA自带的commons-codec包就提供了获取16进制MD5值的方法。其底层实现上,也是分多次将一个文件读入,类似方法三。所以性能上也不错

 DigestUtils.md5Hex(new FileInputStream(path));

 

方法五:

方法五接收的参数直接采用了MultipartFile 形式,在一些上传文件的过程中,可以直接实用,省的在对文件流进行操作。

  /*** 获取上传文件的md5** @param file 上传文件MD5* @return*/public static String getFileMd5(MultipartFile file)  {try {byte[] uploadBytes = file.getBytes();MessageDigest md5 = MessageDigest.getInstance("MD5");byte[] digest = md5.digest(uploadBytes);String hashString = new BigInteger(1, digest).toString(16);return hashString;} catch (Exception e) {e.printStackTrace();return null;}}

总结

每种方法都可以,根据实际需求。


https://dhexx.cn/news/show-4151898.html

相关文章

Redis的事务性

简介&#xff1a; Redis我们常常称其为内存数据库&#xff0c;而在传统的关系型数据库中&#xff0c;事务性又是不得不面临的一个问题&#xff0c;所谓事物性&#xff0c;说简单点&#xff0c;就是一组数据库操作之间是有关联关系的&#xff0c;要么全部都执行成功&#xff0c…

java 查询字符串中首个数字出现的位置

/*** 查询字符串中首个数字出现的位置* param str 查询的字符串* return 若存在&#xff0c;返回位置索引&#xff0c;否则返回-1&#xff1b;*/public static int findFirstIndexNumberOfStr(String str){int i -1;Matcher matcher Pattern.compile("[0-9]").matc…

Java 从List中删除空值

1. Java 7或更低版​​本&#xff1a;list.removeAll(Collections.singleton(null)); 2. Java 8或更高版本(推荐): public void removeAllNullsFromListWithJava8() {List<String> list new ArrayList<>(Arrays.asList("A", null, "B", nul…

nginx部署 上传文件提示413 Request Entity Too Large错误

现象&#xff1a; 在开发中&#xff0c;用nginx作为代理服务器进行web项目部署&#xff0c;在上传Excel文件时&#xff0c;出现如下错误&#xff1a; 原因&#xff1a; 这是因为nginx在默认的设置网页上传文件的最大值是1M client_max_body_size 1M #设置网页上传文件的最大…

nginx 报 upstream sent too big header while reading response header from upstream

场景&#xff1a; 以Nginx作为代理服务器进行负载均衡处理&#xff0c;发布项目为一个互联网项目&#xff0c;在进行一个接口调用时&#xff08;此接口为上传Excel并解析&#xff0c;解析的一部分数据会在后端存储到cookie中&#xff09;。 正常上传Excel是没问题的&#xff…

Java POI解析Excel的跨Sheet读取数据验证下拉值

存在一个Excel文件&#xff0c;其中有列数据是下拉选择&#xff0c;且下拉的来源是在另外一个Sheet中 这个时候&#xff0c;我们使用POI对其进行解析&#xff0c;想获得数据验证的个数&#xff1a;sheet.getDataValidations() public static void main(String[] args) throws E…

Java Excel 列号数字与字母互相转换

在工作中Excel解析时&#xff0c;常常需要将列号的字母转换成对应的数字序号。 package test;public class ExcelColumn {public static void main(String[] args) {String colstr "AA";int colIndex excelColStrToNum(colstr, colstr.length());System.out.print…

Nginx配置上传文件大小上限

在用Nginx做代理服务器时&#xff0c;上传文件&#xff0c;发现上传不了。 在nginx.conf配置文件中的http块中配置client_max_body_size参数 http {include mime.types;default_type application/octet-stream;client_header_buffer_size 512k;large_client_header_bu…

npm ERR! Response timeout while trying to fetch https://registry.npmjs.org/npm (over 30000ms)

问题&#xff1a; 如标题所示&#xff0c;在适用npm对vue-element-admin进行安装时执行命令 npm install 执行后报如下错误&#xff1a; npm ERR! Response timeout while trying to fetch https://registry.npmjs.org/npm (over 30000ms) 原因&#xff1a; 通过命令查询镜…

npm国内镜像及配置方法

npm全称Node Package Manager&#xff0c;是node.js的模块依赖管理工具。由于npm的源在国外&#xff0c;所以国内用户使用起来各种不方便。下面整理出了一部分国内优秀的npm镜像资源&#xff0c;国内用户可以选择使用。 国内优秀npm镜像 淘宝npm镜像 搜索地址&#xff1a;htt…