开发中业务操作相关的记录-Java校验两个文件内容是否相同-《Java笔记》

admin 2025-10-19 03:22:30 编程 来源:ZONE.CI 全球网 0 阅读模式

Java

文件摘要校验

有些小工具会附带一个校验器校验附带提供的checksum值,防止有人恶意篡改小工具,保证小工具可以放心使用。Java校验两个文件内容是否相同 - 图1文件Hash校验如果两个文件的内容相同,那么它们的摘要应该是相同的。这个原理能不能鉴定两个文件是否相同呢?

Java实现文件摘要

带着这个疑问,写了一个文件摘要提取工具类:

  1. /**
  2. * 提取文件 checksum
  3. *
  4. * @param path 文件全路径
  5. * @param algorithm 算法名 例如 MD5、SHA-1、SHA-256等
  6. * @return checksum
  7. * @throws NoSuchAlgorithmException the no such algorithm exception
  8. * @throws IOException the io exception
  9. */
  10. public static String extractChecksum(String path, String algorithm) throws NoSuchAlgorithmException, IOException {
  11. // 根据算法名称初始化摘要算法
  12. MessageDigest digest = MessageDigest.getInstance(algorithm);
  13. // 读取文件的所有比特
  14. byte[] fileBytes = Files.readAllBytes(Paths.get(path));
  15. // 摘要更新
  16. digest.update(fileBytes);
  17. //完成哈希摘要计算并返回特征值
  18. byte[] digested = digest.digest();
  19. // 进行十六进制的输出
  20. return HexUtils.toHexString(digested);
  21. }

接下来做几组对照试验来证明猜想。

内容不变

首先要证明一个文件在内容不变的情况下摘要是否有变化,多次执行下面的代码,断言始终都是true。

  1. String path = "C:\\Users\\s1\\IdeaProjects\\demo\\src\\main\\resources\\application.yml";
  2. String checksum = extractChecksum(path, "SHA-1");
  3. String hash = "6bf4d6c101b4a7821226d3ec1f8d778a531bf265";
  4. Assertions.assertEquals(hash,checksum);

而且把文件名改成application-dev.yml,甚至application-dev.txt摘要都是相同的。又把yml文件的内容作了改动,断言就false了。这证明了单个文件的情况下,内容不变,hash是不变的。

文件复制

把yml文件复制了一份,改了文件名称和类型,不改变内容并存到了另一个目录中,来测试一下它们的摘要是否有变化。

  1. String path1 = "C:\\Users\\s1\\IdeaProjects\\demo\\src\\main\\resources\\application.yml";
  2. String path2 = "C:\\Users\\s1\\IdeaProjects\\demo\\src\\main\\resources\\templates\\application-dev.txt";
  3. String checksum1 = extractChecksum(path1, "SHA-1");
  4. String checksum2 = extractChecksum(path2, "SHA-1");
  5. String hash = "6bf4d6c101b4a7821226d3ec1f8d778a531bf265";
  6. Assertions.assertEquals(hash,checksum1);
  7. Assertions.assertEquals(hash,checksum2);

结果断言通过,不过改变了其中一个文件的内容后断言就不通过了。

新建空文件

这里的新建空文件指的是没有进行任何操作的新建的空文件。新建的空文件会根据特定的算法返回一个固定值,比如SHA-1算法下的空文件值是:

  1. da39a3ee5e6b4b0d3255bfef95601890afd80709

结论

通过实验证明了:

  • 在相同算法下,任何新建空文件的摘要值都是固定的。
  • 任何两个内容相同的文件的摘要值都是相同的,和路径、文件名、文件类型无关。
  • 文件的摘要值会随着文件内容的改变而改变。

    文件摘要运用

    根据上面的结论,文件摘要是可以防止同样内容的文件重复提交的, 存储的时候不但要存储文件的路径,还要存储文件的摘要值,可能需要注意新建空文件的的固定摘要问题。另外在Java12中提供了新的API来处理文件内容重复问题:Java12新特性
以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  10