文档章节

计算文件MD5 Checksum的几种方法

王孟君
 王孟君
发布于 2017/05/12 18:45
字数 645
阅读 1141
收藏 20
点赞 0
评论 0

本文给出几种获取文件MD5 (CheckSum)的方法。

文件使用MD5 CheckSum的目的?

在一些场景中,比如文件传输(如插件、固件升级包等),MD5 CheckSum的作用就是用于检查文件完整性,检测文件是否被恶意篡改

Apache网站上,我们下载文件的时候,都可以看到MD5 checksum的值,如下图所示:

  接下来,我们就给出几种文件产生MD5 (checkSum)的方法。

使用java.security.MessageDigest

    public static String genMD5Checksum1(File file) throws NoSuchAlgorithmException, IOException {

        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(Files.readAllBytes(file.toPath()));
        byte[] digestBytes = messageDigest.digest();
        StringBuffer sb = new StringBuffer();
        for (byte b : digestBytes) {
            sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
    }

其中,下面的这段代码,

        StringBuffer sb = new StringBuffer();
        for (byte b : digestBytes) {
            sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();

可以使用javax.xml.bind.DatatypeConverter的方法来做。

    public static String genMD5Checksum2(File file) throws NoSuchAlgorithmException, IOException {

        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(Files.readAllBytes(file.toPath()));
        byte[] digestBytes = messageDigest.digest();
        return DatatypeConverter.printHexBinary(digestBytes).toLowerCase();
    }

因为,DatatypeConverter.printHexBinary(digestBytes)返回的字符大写,

所以添加了toLowerCase()方法保持其一致性。

使用org.apache.commons.codec.digest.DigestUtils

使用commons-codec来完成,Maven工程需要添加依赖包,如:

		<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.10</version>
		</dependency>

Java代码如下:

​
    public static String genMD5Checksum3(File file) throws FileNotFoundException, IOException {
        /**
         * 使用org.apache.commons.codec.digest.DigestUtils
         */
        String md5Checksum = DigestUtils.md5Hex(new FileInputStream(file));
        return md5Checksum;
    }

​

使用Guava

添加Guava依赖包,如:

		<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>19.0</version>
		</dependency>

Java代码如下:

    public static String genMD5Checksum4(File file) throws IOException {
        /**
         * 使用Guava
         */
        HashCode md5Hash = com.google.common.io.Files.hash(file, Hashing.md5());
        return md5Hash.toString();
    }

完整代码和测试

上述几种方法,完整的示例和测试代码如下~

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.xml.bind.DatatypeConverter;

import org.apache.commons.codec.digest.DigestUtils;

import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;

/**
 * @Type MD5ChecksumGenerator.java
 * @author wangmengjun
 * @date 2017年5月12日 下午6:21:08
 * @version 1.0
 */
public class MD5ChecksumGenerator {

    public static String genMD5Checksum1(File file) throws NoSuchAlgorithmException, IOException {

        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(Files.readAllBytes(file.toPath()));
        byte[] digestBytes = messageDigest.digest();
        StringBuffer sb = new StringBuffer();
        for (byte b : digestBytes) {
            sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
        }
        return sb.toString();
    }

    public static String genMD5Checksum2(File file) throws NoSuchAlgorithmException, IOException {

        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.update(Files.readAllBytes(file.toPath()));
        byte[] digestBytes = messageDigest.digest();
        return DatatypeConverter.printHexBinary(digestBytes).toLowerCase();
    }

    public static String genMD5Checksum3(File file) throws FileNotFoundException, IOException {
        /**
         * 使用org.apache.commons.codec.digest.DigestUtils
         */
        String md5Checksum = DigestUtils.md5Hex(new FileInputStream(file));
        return md5Checksum;
    }

    public static String genMD5Checksum4(File file) throws IOException {
        /**
         * 使用Guava
         */
        HashCode md5Hash = com.google.common.io.Files.hash(file, Hashing.md5());
        return md5Hash.toString();
    }
}

测试代码如下:

import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;

public class Main {

    public static void main(String[] args) throws IOException, NoSuchAlgorithmException {

        System.out.println(String.format("genMD5Checksum1() --> %s",
                MD5ChecksumGenerator.genMD5Checksum1(new File("f://poi-bin-3.16-20170419.zip"))));
        
        System.out.println(String.format("genMD5Checksum2() --> %s",
                MD5ChecksumGenerator.genMD5Checksum2(new File("f://poi-bin-3.16-20170419.zip"))));
        
        System.out.println(String.format("genMD5Checksum3() --> %s",
                MD5ChecksumGenerator.genMD5Checksum3(new File("f://poi-bin-3.16-20170419.zip"))));
        
        System.out.println(String.format("genMD5Checksum4() --> %s",
                MD5ChecksumGenerator.genMD5Checksum4(new File("f://poi-bin-3.16-20170419.zip"))));
    }
 
}

代码运行如下:

genMD5Checksum1() --> c0b16803ee4ebdc1da1240c7fb28c997
genMD5Checksum2() --> c0b16803ee4ebdc1da1240c7fb28c997
genMD5Checksum3() --> c0b16803ee4ebdc1da1240c7fb28c997
genMD5Checksum4() --> c0b16803ee4ebdc1da1240c7fb28c997

和Apache页面上下载文件poi-bin-3.16-20170419.zip的MD5 checkSum相比较,我们发现是一致的~

© 著作权归作者所有

共有 人打赏支持
王孟君

王孟君

粉丝 214
博文 94
码字总数 221044
作品 0
杭州
高级程序员
AIDE入侵检测

一、AIDE · AIDE全称为(Adevanced Intrusion DetectionEnvironment)是一个入侵检测工具,主要用于检查文件的完整性,审计系统中的工具是否被更改过。 · AIDE会构造一个数据库文件,当系统在...

拎壶冲冲冲 ⋅ 2017/09/18 ⋅ 0

推陈出新:12C 推进 SCN 新方法实践

超过10年专职电信行业 Oracle 数据库管理和运维经验,熟悉电信行业的业务、数据库及硬件架构。擅长数据库各种迁移方法、优化、疑难故障排除、数据库异常恢复等。 在数据库异常恢复中,经常需...

技术小能手 ⋅ 04/08 ⋅ 0

EasyPlayer RTSP 安卓Android播放器显示模式设置方法

一般对于一个播放器,应该支持如下几种显示模式: 等比例,最大化区域显示,不裁剪 等比例,最大区域显示,裁剪 拉伸显示,铺满全屏 要实现这几种显示模式,其实只要对播放控件的布局进行些许调整即可...

xiejiashu ⋅ 2017/12/26 ⋅ 0

Node.js child_process模块解读

在介绍child_process模块之前,先来看一个例子。 可以试一下使用上面的代码启动Node.js服务,然后打开两个浏览器选项卡分别访问/compute和/,可以发现node服务接收到/compute请求时会进行大量...

Randal ⋅ 06/01 ⋅ 0

Java异常处理机制与最佳实践

  这周小组内的学习是探讨Java异常处理的最佳实践,今天周末,外面太闷,宅在家里对Java的异常处理做一个总结,如有不对的地方欢迎指正~ 一. 谈谈个人对Java异常处理的看法   维基百科对...

zhenchao ⋅ 2016/08/13 ⋅ 0

在仿真器中运行时跳过Windows Azure Startup任务

Startup任务通常被用在Windows Azure中安装东西或改变托管角色代码虚拟机的一些配置。有时当你通过计算仿真器在当地运行和测试时你不想执行那些安装步骤。(例如,你可能跳过一个冗长的下载或...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

_rambo/nodejs_cluster_compute

nodejsclustercompute 众所周知,nodejs优势在于 。 但是正如网上nodejs开发工程师所说 。因为他在计算大量密集型计算的时候,往往发生难以想象的各种意外的阻塞。这时候nodejs只能等待其完成...

_rambo ⋅ 2015/08/03 ⋅ 0

使用spark计算文档相似度

1、TF-IDF文档转换为向量 以下边三个句子为例 经过分词后变为 经过词频(TF)计算后,词频=某个词在文章中出现的次数 262144为总词数,这个值越大,不同的词被计算为一个Hash值的概率就越小,...

最帅的刘先生 ⋅ 2016/12/21 ⋅ 0

使用spark计算文档相似度

1、TF-IDF文档转换为向量 以下边三个句子为例 经过分词后变为 经过词频(TF)计算后,词频=某个词在文章中出现的次数 262144为总词数,这个值越大,不同的词被计算为一个Hash值的概率就越小,...

penngo ⋅ 2016/12/17 ⋅ 2

Hive 中的 LEFT SEMI JOIN 与 JOIN ON 的前世今生

hive 的 join 类型有好几种,其实都是把 MR 中的几种方式都封装实现了,其中 join on、left semi join 算是里边具有代表性,且使用频率较高的 join 方式。 1、联系 他们都是 hive join 方式的...

xrzs ⋅ 2013/12/28 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 52分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部