原文地址:http://blog.csdn.net/qq_25646191/article/details/78863110

如何知道一个文件是否改变了呢?当然是用比较文件hash值的方法,文件hash又叫文件签名,文件中哪怕一个bit位被改变了,文件hash就会不同。

比较常用的文件hash算法有MD5和SHA-1。
我用的是MD5算法,java中,计算MD5可以用MessageDigest这个类。

下面是代码:

  1. package com.test;
  2. import java.io.FileInputStream;
  3. import java.io.FileNotFoundException;
  4. import java.io.InputStream;
  5. import java.math.BigInteger;
  6. import java.security.MessageDigest;
  7. public class MD5Util {
  8. public static void main(String[] args) {
  9. try {
  10. //此处我测试的是我本机jdk源码文件的MD5值
  11. String filePath = "C:\\Program Files\\Java\\jdk1.7.0_45\\src.zip";
  12. String md5Hashcode = md5HashCode(filePath);
  13. String md5Hashcode32 = md5HashCode32(filePath);
  14. System.out.println(md5Hashcode + ":文件的md5值");
  15. System.out.println(md5Hashcode32+":文件32位的md5值");
  16. //System.out.println(-100 & 0xff);
  17. } catch (FileNotFoundException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. /**
  22. * 获取文件的md5值 ,有可能不是32位
  23. * @param filePath  文件路径
  24. * @return
  25. * @throws FileNotFoundException
  26. */
  27. public static String md5HashCode(String filePath) throws FileNotFoundException{
  28. FileInputStream fis = new FileInputStream(filePath);
  29. return md5HashCode(fis);
  30. }
  31. /**
  32. * 保证文件的MD5值为32位
  33. * @param filePath  文件路径
  34. * @return
  35. * @throws FileNotFoundException
  36. */
  37. public static String md5HashCode32(String filePath) throws FileNotFoundException{
  38. FileInputStream fis = new FileInputStream(filePath);
  39. return md5HashCode32(fis);
  40. }
  41. /**
  42. * java获取文件的md5值
  43. * @param fis 输入流
  44. * @return
  45. */
  46. public static String md5HashCode(InputStream fis) {
  47. try {
  48. //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256
  49. MessageDigest md = MessageDigest.getInstance("MD5");
  50. //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。
  51. byte[] buffer = new byte[1024];
  52. int length = -1;
  53. while ((length = fis.read(buffer, 0, 1024)) != -1) {
  54. md.update(buffer, 0, length);
  55. }
  56. fis.close();
  57. //转换并返回包含16个元素字节数组,返回数值范围为-128到127
  58. byte[] md5Bytes  = md.digest();
  59. BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值
  60. return bigInt.toString(16);//转换为16进制
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. return "";
  64. }
  65. }
  66. /**
  67. * java计算文件32位md5值
  68. * @param fis 输入流
  69. * @return
  70. */
  71. public static String md5HashCode32(InputStream fis) {
  72. try {
  73. //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256
  74. MessageDigest md = MessageDigest.getInstance("MD5");
  75. //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。
  76. byte[] buffer = new byte[1024];
  77. int length = -1;
  78. while ((length = fis.read(buffer, 0, 1024)) != -1) {
  79. md.update(buffer, 0, length);
  80. }
  81. fis.close();
  82. //转换并返回包含16个元素字节数组,返回数值范围为-128到127
  83. byte[] md5Bytes  = md.digest();
  84. StringBuffer hexValue = new StringBuffer();
  85. for (int i = 0; i < md5Bytes.length; i++) {
  86. int val = ((int) md5Bytes[i]) & 0xff;//解释参见最下方
  87. if (val < 16) {
  88. /**
  89. * 如果小于16,那么val值的16进制形式必然为一位,
  90. * 因为十进制0,1...9,10,11,12,13,14,15 对应的 16进制为 0,1...9,a,b,c,d,e,f;
  91. * 此处高位补0。
  92. */
  93. hexValue.append("0");
  94. }
  95. //这里借助了Integer类的方法实现16进制的转换
  96. hexValue.append(Integer.toHexString(val));
  97. }
  98. return hexValue.toString();
  99. } catch (Exception e) {
  100. e.printStackTrace();
  101. return "";
  102. }
  103. }
  104. /**
  105. * 方法md5HashCode32 中     ((int) md5Bytes[i]) & 0xff   操作的解释:
  106. * 在Java语言中涉及到字节byte数组数据的一些操作时,经常看到 byte[i] & 0xff这样的操作,这里就记录总结一下这里包含的意义:
  107. * 1、0xff是16进制(十进制是255),它默认为整形,二进制位为32位,最低八位是“1111 1111”,其余24位都是0。
  108. * 2、&运算: 如果2个bit都是1,则得1,否则得0;
  109. * 3、byte[i] & 0xff:首先,这个操作一般都是在将byte数据转成int或者其他整形数据的过程中;使用了这个操作,最终的整形数据只有低8位有数据,其他位数都为0。
  110. * 4、这个操作得出的整形数据都是大于等于0并且小于等于255的
  111. */
  112. }

运行结果如下图:

PS:其实还有一个重点,就是如何知道自己生成的MD5值是否正确呢?

方法很多,其实有一个挺简单的方法,不需要另外安装什么软件。

使用windows自带的命令即可:certutil -hashfile [文件路径] MD5,

例子如下:

【转】Java计算文件的hash值的更多相关文章

  1. C# 计算文件的 Hash 值

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

  2. powershell中使用Get-FileHash计算文件的hash值

    今天在公司一台windows服务器上.需要对两个文件进行比对,笔者首先就想到了可以使用md5校验 但是公司服务器上又不可以随意安装软件,于是笔者想到了可以试试windows自带的powershell中 ...

  3. C#计算文件的MD5值实例

    C#计算文件的MD5值实例 MD5 是 Message Digest Algorithm 5(信息摘要算法)的缩写,MD5 一种散列(Hash)技术,广泛用于加密.解密.数据签名和数据完整性校验等方面 ...

  4. C# 计算文件的HASH

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

  5. c#计算文件的MD5值

    代码: /// <summary> /// 计算文件的 MD5 值 /// </summary> /// <param name="fileName" ...

  6. 计算文件的MD5值和sha256值

    1.计算文件的MD5值. 1)linux系统计算 MD5值:md5sum+文件名 sha256值:sha256su+文件名 2)windows系统计算 MD5值:利用Notepad++工具计算 sha ...

  7. 在.NET中计算文件的MD5值

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...

  8. Java计算文件MD5值(支持大文件)

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.securit ...

  9. 计算文件的MD5值(Java & Rust)

    Java public class TestFileMD5 { public final static String[] hexDigits = { "0", "1&qu ...

随机推荐

  1. 那些令人喷饭的代码注释:仅以此代码献给...it's realy ?

    程序源代码中的注释经常是一个卧虎藏龙的地方,有人就很喜欢写幽默搞笑的注释内容.解释代码含义的同时,也带给人轻松神经的机会,确实是很有意思的风格,来看看这一辑国外某公司产品中的注释. 注意:看的时候严禁 ...

  2. Python3 命令行参数

    Python 提供了 getopt 模块来获取命令行参数. $ python test.py arg1 arg2 arg3 Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: ...

  3. VB高效导入Excel2003和Excel2007文件到MSHFlexGrid控件显示

    1.VB高效导入Excel2003和Excel2007文件到MSHFlexGrid控件显示 2.以前也有Excel导入通用功能,但速度有些慢一会把两种实现方式都提供出为参考对比. 一.原通用导入exc ...

  4. js日期操作,某天的N天后,一个月后的日期

    var date = new Date(); var tomorrow = date.setDate(new Date().getDate() + 10); //10天后的日期 console.log ...

  5. python sort和sorted函数

    sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 ...

  6. Python 3 的安装

    python 3 的安装: 背景: 之前都是在Pychram上写,我的windows下的python版本是3.5,今天要把一个小脚本上到生产环境上. 无奈我服务器上的python版本是2.6.6.所以 ...

  7. Spring Security教程(六):自定义过滤器进行认证处理

    这里接着上篇的自定义过滤器,这里主要的是配置自定义认证处理的过滤器,并加入到FilterChain的过程. 在我们自己不在xml做特殊的配置情况下,security默认的做认证处理的过滤器为Usern ...

  8. 基于SSD固态硬盘的数据库性能优化

    基于SSD固态硬盘的数据库性能优化 2010-11-08 00:0051cto佚名   关键字:固态硬盘 数据库管理 SSD 企业软件热点文章 Java内存结构与模型结构分析 Oracle触发器的语法 ...

  9. Unity GPU Instancing的使用尝试

    似乎是在Unity5.4中开始支持GPU Instacing,但如果要比较好的使用推荐用unity5.6版本,因为这几个版本一直在改. 这里测试也是使用unity5.6.2进行测试 在5.6的版本里, ...

  10. struts2(三) 输入校验和拦截器

    前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器, --WH 一.输入校验 在以前我们写一个登录页面时,并 ...