【转】Java计算文件的hash值
原文地址:http://blog.csdn.net/qq_25646191/article/details/78863110
如何知道一个文件是否改变了呢?当然是用比较文件hash值的方法,文件hash又叫文件签名,文件中哪怕一个bit位被改变了,文件hash就会不同。
比较常用的文件hash算法有MD5和SHA-1。
我用的是MD5算法,java中,计算MD5可以用MessageDigest这个类。
下面是代码:
- package com.test;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.math.BigInteger;
- import java.security.MessageDigest;
- public class MD5Util {
- public static void main(String[] args) {
- try {
- //此处我测试的是我本机jdk源码文件的MD5值
- String filePath = "C:\\Program Files\\Java\\jdk1.7.0_45\\src.zip";
- String md5Hashcode = md5HashCode(filePath);
- String md5Hashcode32 = md5HashCode32(filePath);
- System.out.println(md5Hashcode + ":文件的md5值");
- System.out.println(md5Hashcode32+":文件32位的md5值");
- //System.out.println(-100 & 0xff);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- /**
- * 获取文件的md5值 ,有可能不是32位
- * @param filePath 文件路径
- * @return
- * @throws FileNotFoundException
- */
- public static String md5HashCode(String filePath) throws FileNotFoundException{
- FileInputStream fis = new FileInputStream(filePath);
- return md5HashCode(fis);
- }
- /**
- * 保证文件的MD5值为32位
- * @param filePath 文件路径
- * @return
- * @throws FileNotFoundException
- */
- public static String md5HashCode32(String filePath) throws FileNotFoundException{
- FileInputStream fis = new FileInputStream(filePath);
- return md5HashCode32(fis);
- }
- /**
- * java获取文件的md5值
- * @param fis 输入流
- * @return
- */
- public static String md5HashCode(InputStream fis) {
- try {
- //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256
- MessageDigest md = MessageDigest.getInstance("MD5");
- //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。
- byte[] buffer = new byte[1024];
- int length = -1;
- while ((length = fis.read(buffer, 0, 1024)) != -1) {
- md.update(buffer, 0, length);
- }
- fis.close();
- //转换并返回包含16个元素字节数组,返回数值范围为-128到127
- byte[] md5Bytes = md.digest();
- BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值
- return bigInt.toString(16);//转换为16进制
- } catch (Exception e) {
- e.printStackTrace();
- return "";
- }
- }
- /**
- * java计算文件32位md5值
- * @param fis 输入流
- * @return
- */
- public static String md5HashCode32(InputStream fis) {
- try {
- //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256
- MessageDigest md = MessageDigest.getInstance("MD5");
- //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。
- byte[] buffer = new byte[1024];
- int length = -1;
- while ((length = fis.read(buffer, 0, 1024)) != -1) {
- md.update(buffer, 0, length);
- }
- fis.close();
- //转换并返回包含16个元素字节数组,返回数值范围为-128到127
- byte[] md5Bytes = md.digest();
- StringBuffer hexValue = new StringBuffer();
- for (int i = 0; i < md5Bytes.length; i++) {
- int val = ((int) md5Bytes[i]) & 0xff;//解释参见最下方
- if (val < 16) {
- /**
- * 如果小于16,那么val值的16进制形式必然为一位,
- * 因为十进制0,1...9,10,11,12,13,14,15 对应的 16进制为 0,1...9,a,b,c,d,e,f;
- * 此处高位补0。
- */
- hexValue.append("0");
- }
- //这里借助了Integer类的方法实现16进制的转换
- hexValue.append(Integer.toHexString(val));
- }
- return hexValue.toString();
- } catch (Exception e) {
- e.printStackTrace();
- return "";
- }
- }
- /**
- * 方法md5HashCode32 中 ((int) md5Bytes[i]) & 0xff 操作的解释:
- * 在Java语言中涉及到字节byte数组数据的一些操作时,经常看到 byte[i] & 0xff这样的操作,这里就记录总结一下这里包含的意义:
- * 1、0xff是16进制(十进制是255),它默认为整形,二进制位为32位,最低八位是“1111 1111”,其余24位都是0。
- * 2、&运算: 如果2个bit都是1,则得1,否则得0;
- * 3、byte[i] & 0xff:首先,这个操作一般都是在将byte数据转成int或者其他整形数据的过程中;使用了这个操作,最终的整形数据只有低8位有数据,其他位数都为0。
- * 4、这个操作得出的整形数据都是大于等于0并且小于等于255的
- */
- }
运行结果如下图:
PS:其实还有一个重点,就是如何知道自己生成的MD5值是否正确呢?
方法很多,其实有一个挺简单的方法,不需要另外安装什么软件。
使用windows自带的命令即可:certutil -hashfile [文件路径] MD5,
例子如下:
【转】Java计算文件的hash值的更多相关文章
- C# 计算文件的 Hash 值
/// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...
- powershell中使用Get-FileHash计算文件的hash值
今天在公司一台windows服务器上.需要对两个文件进行比对,笔者首先就想到了可以使用md5校验 但是公司服务器上又不可以随意安装软件,于是笔者想到了可以试试windows自带的powershell中 ...
- C#计算文件的MD5值实例
C#计算文件的MD5值实例 MD5 是 Message Digest Algorithm 5(信息摘要算法)的缩写,MD5 一种散列(Hash)技术,广泛用于加密.解密.数据签名和数据完整性校验等方面 ...
- C# 计算文件的HASH
/// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...
- c#计算文件的MD5值
代码: /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName" ...
- 计算文件的MD5值和sha256值
1.计算文件的MD5值. 1)linux系统计算 MD5值:md5sum+文件名 sha256值:sha256su+文件名 2)windows系统计算 MD5值:利用Notepad++工具计算 sha ...
- 在.NET中计算文件的MD5值
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...
- Java计算文件MD5值(支持大文件)
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.securit ...
- 计算文件的MD5值(Java & Rust)
Java public class TestFileMD5 { public final static String[] hexDigits = { "0", "1&qu ...
随机推荐
- Linux安装ElasticSearch-2.2.0-分词器插件(Mmseg)
1.在gitpub上搜索elasticsearch-analysis,能够看到所有elasticsearch的分词器: 2.安装Mmseg分词器:https://github.com/medcl/el ...
- Spring-Boot服务注册与发现
关于Eureka服务注册与发现的示例可以参见:http://blog.didispace.com/springcloud1/ 服务注册管理器原理如下图所示: 1.建立eureka服务器 @Enable ...
- TextView中显示链接 定义颜色
<TextView android:id="@+id/textView" android:layout_width="match_parent" andr ...
- golang学习笔记---函数、方法和接口
函数:对应操作序列,是程序的基本组成元素. 函数有具名和匿名之分:具名函数一般对应于包级的函数,是匿名函数的一种特例,当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心 ...
- win7 git 安装
下载git: https://git-scm.com/download/win 二.Git安装 去官网下载完后一路下一步完成安装,如下图: 安装完后先在系统环境变量中看下是否配置 然后在桌面右 ...
- 【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
转自:[欧阳鹏]http://blog.csdn.net/ouyang_peng Android 设备的CPU类型(通常称为”ABIs”) armeabiv-v7a: 第7代及以上的 ARM 处理器. ...
- python 爬虫 重复下载 二次请求
在写爬虫的时候,难免会遇到报错,比如 4XX ,5XX,有些可能是网络的原因,或者一些其他的原因,这个时候我们希望程序去做第二次下载, 有一种很low的解决方案,比如是用 try except t ...
- 针对MSHFlexGrid的一系列通用方法-项目中实践代码分享
1.给MSHFlexGrid填充数据通用方法 '自定义报表填充程序 fgrid Public Function ShowformfData(Resultset As ADODB.Recordset, ...
- 深入理解Linux内核-访问文件
文件的访问模式:1.规范模式:2.同步模式:3.内存映射模式:4.直接I\O模式5.异步模式: 内存映射模式:1.共享型:在线性区页上的任何写操作都会修改磁盘上的文件:而且这种修改对映射了同一文件的所 ...
- Spring Cloud Consul
1.2.0.RELEASE 该项目通过自动配置并绑定到Spring环境和其他Spring编程模型成语,为Spring Boot应用程序提供Consul集成.通过几个简单的注释,您可以快速启用和配置应用 ...