我正在寻找使用Java获取文件的MD5校验和。 我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西。

怎么做?


#1楼

Guava现在提供了一个新的,一致的哈希API,它比JDK中提供的各种哈希API更友好。 请参阅哈希说明 。 对于文件,您可以轻松获得MD5和,CRC32(版本14.0+)或许多其他哈希值:

HashCode md5 = Files.hash(file, Hashing.md5());
byte[] md5Bytes = md5.asBytes();
String md5Hex = md5.toString();HashCode crc32 = Files.hash(file, Hashing.crc32());
int crc32Int = crc32.asInt();// the Checksum API returns a long, but it's padded with 0s for 32-bit CRC
// this is the value you would get if using that API directly
long checksumResult = crc32.padToLong();

#2楼

public static void main(String[] args) throws Exception {MessageDigest md = MessageDigest.getInstance("MD5");FileInputStream fis = new FileInputStream("c:\\apache\\cxf.jar");byte[] dataBytes = new byte[1024];int nread = 0;while ((nread = fis.read(dataBytes)) != -1) {md.update(dataBytes, 0, nread);};byte[] mdbytes = md.digest();StringBuffer sb = new StringBuffer();for (int i = 0; i < mdbytes.length; i++) {sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));}System.out.println("Digest(in hex format):: " + sb.toString());
}

或者您可能会获得更多信息http://www.asjava.com/core-java/java-md5-example/


#3楼

好。 我必须补充。 对于已经具有Spring和Apache Commons依赖项或计划添加它的人的一线实施:

DigestUtils.md5DigestAsHex(FileUtils.readFileToByteArray(file))

对于和仅Apache Commons选项(credit @duleshi):

DigestUtils.md5Hex(FileUtils.readFileToByteArray(file))

希望这对某人有帮助。


#4楼

标准Java运行时环境方式 :

public String checksum(File file) {try {InputStream fin = new FileInputStream(file);java.security.MessageDigest md5er =MessageDigest.getInstance("MD5");byte[] buffer = new byte[1024];int read;do {read = fin.read(buffer);if (read > 0)md5er.update(buffer, 0, read);} while (read != -1);fin.close();byte[] digest = md5er.digest();if (digest == null)return null;String strDigest = "0x";for (int i = 0; i < digest.length; i++) {strDigest += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1).toUpperCase();}return strDigest;} catch (Exception e) {return null;}
}

结果等于linux md5sum实用程序。


#5楼

Google番石榴提供了新的API。 在下面找到一个:

public static HashCode hash(File file,HashFunction hashFunction)throws IOExceptionComputes the hash code of the file using hashFunction.Parameters:file - the file to readhashFunction - the hash function to use to hash the data
Returns:the HashCode of all of the bytes in the file
Throws:IOException - if an I/O error occurs
Since:12.0

#6楼

public static String getMd5OfFile(String filePath)
{String returnVal = "";try {InputStream   input   = new FileInputStream(filePath); byte[]        buffer  = new byte[1024];MessageDigest md5Hash = MessageDigest.getInstance("MD5");int           numRead = 0;while (numRead != -1){numRead = input.read(buffer);if (numRead > 0){md5Hash.update(buffer, 0, numRead);}}input.close();byte [] md5Bytes = md5Hash.digest();for (int i=0; i < md5Bytes.length; i++){returnVal += Integer.toString( ( md5Bytes[i] & 0xff ) + 0x100, 16).substring( 1 );}} catch(Throwable t) {t.printStackTrace();}return returnVal.toUpperCase();
}

#7楼

使用nio2(Java 7+)且不使用外部库:

byte[] b = Files.readAllBytes(Paths.get("/path/to/file"));
byte[] hash = MessageDigest.getInstance("MD5").digest(b);

要将结果与预期校验和进行比较:

String expected = "2252290BC44BEAD16AA1BF89948472E8";
String actual = DatatypeConverter.printHexBinary(hash);
System.out.println(expected.equalsIgnoreCase(actual) ? "MATCH" : "NO MATCH");

#8楼

使用Java 7无需第三方库的简单方法

String path = "your complete file path";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(path)));
byte[] digest = md.digest();

如果需要打印此字节数组。 用途如下

System.out.println(Arrays.toString(digest));

如果您需要此摘要中的十六进制字符串。 用途如下

String digestInHex = DatatypeConverter.printHexBinary(digest).toUpperCase();
System.out.println(digestInHex);

其中DatatypeConverter是javax.xml.bind.DatatypeConverter


#9楼

使用Apache Commons Codec库中的DigestUtils :

try (InputStream is = Files.newInputStream(Paths.get("file.zip"))) {String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(is);
}

#10楼

非常快速,干净的Java方法,不依赖外部库:

(如果需要,只需用SHA-1,SHA-256,SHA-384或SHA-512替换MD5)

public String calcMD5() throws Exception{byte[] buffer = new byte[8192];MessageDigest md = MessageDigest.getInstance("MD5");DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("Path to file")), md);try {while (dis.read(buffer) != -1);}finally{dis.close();}byte[] bytes = md.digest();// bytesToHex-methodchar[] hexChars = new char[bytes.length * 2];for ( int j = 0; j < bytes.length; j++ ) {int v = bytes[j] & 0xFF;hexChars[j * 2] = hexArray[v >>> 4];hexChars[j * 2 + 1] = hexArray[v & 0x0F];}return new String(hexChars);
}

#11楼

Real的Java-How-to中有一个使用MessageDigest类的示例。

在该页面上查看使用CRC32和SHA-1的示例。

import java.io.*;
import java.security.MessageDigest;public class MD5Checksum {public static byte[] createChecksum(String filename) throws Exception {InputStream fis =  new FileInputStream(filename);byte[] buffer = new byte[1024];MessageDigest complete = MessageDigest.getInstance("MD5");int numRead;do {numRead = fis.read(buffer);if (numRead > 0) {complete.update(buffer, 0, numRead);}} while (numRead != -1);fis.close();return complete.digest();}// see this How-to for a faster way to convert// a byte array to a HEX stringpublic static String getMD5Checksum(String filename) throws Exception {byte[] b = createChecksum(filename);String result = "";for (int i=0; i < b.length; i++) {result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );}return result;}public static void main(String args[]) {try {System.out.println(getMD5Checksum("apache-tomcat-5.5.17.exe"));// output ://  0bb2827c5eacf570b6064e24e0e6653b// ref ://  http://www.apache.org/dist///          tomcat/tomcat-5/v5.5.17/bin//              /apache-tomcat-5.5.17.exe.MD5//  0bb2827c5eacf570b6064e24e0e6653b *apache-tomcat-5.5.17.exe}catch (Exception e) {e.printStackTrace();}}
}

#12楼

有一个输入流装饰器java.security.DigestInputStream ,因此您可以像往常一样在使用输入流的同时计算摘要,而不必对数据进行额外的传递。

MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = Files.newInputStream(Paths.get("file.txt"));DigestInputStream dis = new DigestInputStream(is, md))
{/* Read decorated stream (dis) to EOF as normal... */
}
byte[] digest = md.digest();

#13楼

我最近不得不对一个动态字符串执行此操作, MessageDigest可以以多种方式表示哈希。 要像使用md5sum命令一样获得文件的签名,我必须执行以下操作:

try {String s = "TEST STRING";MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(s.getBytes(),0,s.length());String signature = new BigInteger(1,md5.digest()).toString(16);System.out.println("Signature: "+signature);} catch (final NoSuchAlgorithmException e) {e.printStackTrace();
}

显然,这并不能回答您关于如何专门针对文件执行操作的问题,以上答案很好地解决了这一问题。 我只是花了很多时间使总和看起来像大多数应用程序的显示,并认为您可能会遇到同样的麻烦。


#14楼

如果您要使用ANT进行构建,这简直是死路一条。 将以下内容添加到您的build.xml中:

<checksum file="${jarFile}" todir="${toDir}"/>

其中jarFile是您要针对其生成MD5的JAR,toDir是您要放置MD5文件的目录。

更多信息在这里。


#15楼

public static String MD5Hash(String toHash) throws RuntimeException {try{return String.format("%032x", // produces lower case 32 char wide hexa left-padded with 0new BigInteger(1, // handles large POSITIVE numbers MessageDigest.getInstance("MD5").digest(toHash.getBytes())));}catch (NoSuchAlgorithmException e) {// do whatever seems relevant}
}

#16楼

String checksum = DigestUtils.md5Hex(new FileInputStream(filePath));

#17楼

这是一个简单的函数,它包装了Sunil的代码,因此它将File作为参数。 该函数不需要任何外部库,但确实需要Java 7。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;import javax.xml.bind.DatatypeConverter;public class Checksum {/*** Generates an MD5 checksum as a String.* @param file The file that is being checksummed.* @return Hex string of the checksum value.* @throws NoSuchAlgorithmException* @throws IOException*/public static String generate(File file) throws NoSuchAlgorithmException,IOException {MessageDigest messageDigest = MessageDigest.getInstance("MD5");messageDigest.update(Files.readAllBytes(file.toPath()));byte[] hash = messageDigest.digest();return DatatypeConverter.printHexBinary(hash).toUpperCase();}public static void main(String argv[]) throws NoSuchAlgorithmException, IOException {File file = new File("/Users/foo.bar/Documents/file.jar");          String hex = Checksum.generate(file);System.out.printf("hex=%s\n", hex);            }}

输出示例:

hex=B117DD0C3CBBD009AC4EF65B6D75C97B

#18楼

我们使用的代码类似于上一篇文章中使用上面代码的代码,

...
String signature = new BigInteger(1,md5.digest()).toString(16);
...

但是,请注意此处使用BigInteger.toString() ,因为它将截断前导零...(例如,尝试s = "27" ,校验和应为"02e74f10e0327ad868d138f2b4fdd6f0"

我第二次使用Apache Commons Codec的建议,我用它替换了自己的代码。


#19楼

com.google.common.hash API提供了:

  • 适用于所有哈希函数的统一的用户友好型API
  • murmur3的可植入32位和128位实现
  • md5(),sha1(),sha256(),sha512()适配器,仅更改一行代码即可在它们之间切换,并发出杂音。
  • goodFastHash(int bits),当您不关心使用什么算法时
  • HashCode实例的通用实用程序,例如CombineOrdered / CombineUnordered

阅读用户指南( IO解释 , 哈希解释 )。

对于您的用例, Files.hash()计算并返回文件的摘要值。

例如, sha-1摘要计算(将SHA-1更改为MD5以获取MD5摘要)

HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();

请注意, crc32比md5快得多,因此如果不需要密码安全的校验和,请使用crc32 。 还要注意, md5不应用于存储密码等,因为它易于暴力破解,因为密码使用bcrypt , scrypt或sha-256代替。

为了使用散列进行长期保护, Merkle签名方案增加了安全性,并且由欧盟委员会赞助的后量子密码学研究小组建议将此密码用于长期保护以免受量子计算机的侵害( 参考 )。

请注意, crc32具有更高的冲突率。


#20楼

这是一个方便的变体,它使用Java 9中的InputStream.transferTo()和Java 11中的OutputStream.nullOutputStream() 。它不需要外部库,也不需要将整个文件加载到内存中。

public static String hashFile(String algorithm, File f) throws IOException, NoSuchAlgorithmException {MessageDigest md = MessageDigest.getInstance(algorithm);try(BufferedInputStream in = new BufferedInputStream((new FileInputStream(f)));DigestOutputStream out = new DigestOutputStream(OutputStream.nullOutputStream(), md)) {in.transferTo(out);}String fx = "%0" + (md.getDigestLength()*2) + "x";return String.format(fx, new BigInteger(1, md.digest()));
}

hashFile("SHA-512", Path.of("src", "test", "resources", "some.txt").toFile());

退货

"e30fa2784ba15be37833d569280e2163c6f106506dfb9b07dde67a24bfb90da65c661110cf2c5c6f71185754ee5ae3fd83a5465c92f72abd888b03187229da29"

#21楼

另一个实现: Java的快速MD5实现

String hash = MD5.asHex(MD5.getHash(new File(filename)));

用Java获取文件的MD5校验和相关推荐

  1. 用JAVA获取文件的MD5哈希码

    获取文件的哈希码是一项常见的编程任务.MD5 是一种非常流行和常用的哈希算法.使用 Java 可以轻松获取文件的 MD5 哈希码,如下面的代码所示: import java.io.BufferedIn ...

  2. JAVA 获取文件的MD5值大小以及常见的工具类

    1 /** 2 * 获取文件的MD5值大小 3 * 4 * @param file 5 * 文件对象 6 * @return 7 */ 8 public static String getMD5(Fi ...

  3. linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料

    下面我给各位朋友总结一下在linux中利用shell命令来获取文件md5及遍历目录下所有文件的md5的例子,希望此例子对各位同学会有所帮助, 获取文件的MD5值: $ md5sum linuxmint ...

  4. Java 查看文件绝对路径,JAVA获取文件绝对路径的方法

    本文实例讲述了JAVA获取文件绝对路径的方法.分享给大家供大家参考.具体实现方法如下: /** * 获取一个类的class文件所在的绝对路径. 这个类可以是JDK自身的类,也可以是用户自定义的类,或者 ...

  5. C#获取文件的MD5码

    using System; using System.IO; using System.Security.Cryptography; using System.Text;namespace SendO ...

  6. 如何获取服务器上文件的hashcode,java获取文件hashcode

    java获取文件hashcode [2021-02-05 18:36:57]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&quo ...

  7. Java获取文件路径

    Java获取文件路径 1.获取当前文件所在的包名 2.获取工程文件夹所在的绝对路径 3.获取当前class文件所在的绝对路径 1.获取当前文件所在的包名 类名.class.getPackage().g ...

  8. c++判断文件是否被修改(获取文件的MD5值)

    需求分析 因为项目中需要检测一个文件是否被篡改,我采用了监测文件的MD5值. MD5,简单地来说,就是文件的"指纹".如果原始文件被修改了,那么MD5值也就会跟着发生变化,所以我们 ...

  9. android黑窗口获取md5_Android获取文件的MD5

    什么是MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有 ...

最新文章

  1. python正则表达式代码_python的re正则表达式实例代码
  2. linux如何配置vnc服务器,Linux下VNCServer配置详解
  3. 设置pandas显示行数_Pandas这样来设置,做数据分析舒适百倍
  4. js加载音频文件并播放,代码实例
  5. 为什么java jvm.dll_Windows下java、javaw、javaws以及jvm.dll等进程的区别
  6. 阿里巴巴内部开发手册
  7. layui 树状图默认全部展开_SolidWorks 钣金展开基础设定
  8. linux程序没有对日志文件写的权限_好程序员云计算培训分享Linux文件权限简单说明...
  9. iOS:CoreData数据库的使用二(创建多个数据库表,表之间有对应关系)
  10. H2080刷卡门禁一体机使用说明书 誉诚AD281A-T楼宇主机说明书
  11. quartz 定时任务 表达式
  12. alize blue_泽野弘之 | 明明可以靠才华,却非要用脸滚键盘的神曲缔造者
  13. mysql进销存表设计_ERP进销存-用户表 - 数据库设计 - 数据库表结构 - 果创云
  14. python中pop什么意思_python里pop是什么意思
  15. 【基金量化研究系列】大类资产配置研究(六)——多资产风险平价策略
  16. 基于java的KTV点歌选歌系统
  17. QQ音乐、网易云音乐、酷狗音乐歌单导入到Spotify
  18. Hudi-Flink CDC将MySQL数据写入hudi
  19. java 时间类 joda_Java Joda-Time 处理时间工具类(JDK1.7以上)
  20. Datawhale学习笔记【阿里云天池 金融风控-贷款违约预测】Task2 数据分析

热门文章

  1. Java String split 使用详解、split 方法存在的一些坑
  2. A problem occurred evaluating project ':'. ASCII
  3. Android系统源码导入Android studio
  4. Volley源码分析
  5. 第十、十一周项目四 - 教师兼干部类
  6. Android10.0 Binder通信原理(八)-Framework层分析
  7. Code Push 热更新使用详细说明和教程
  8. Spark任务提交流程
  9. UIScrollView 使用
  10. watch netstat