从摘要或校验和中检测目录(java 8)中已更改的文件

问题描述 投票:0回答:3

我正在寻找一种简单的方法来检测两次重新启动之间目录中的文件是否已更改,以避免不必要的同步。在Java 8库中执行此操作的最简单方法是什么?我应该对每个文件的md5摘要进行异或还是对每个文件的校验和进行异或?

我们不需要处理进入子目录的ATM。

此外,我们不应使用OS事件来检测此更改,因为将仅在启动时调用检测方法。目录中文件的数量可以在应用程序的不同版本之间改变,但是这些文件通常在重新启动之间不会改变。

这看起来像一个相关的帖子:https://crypto.stackexchange.com/questions/1368/is-it-a-good-idea-to-use-bitwise-xor-on-a-set-of-md5-sums

java md5 checksum
3个回答
2
投票
一方面,您可以利用文件时间戳。但是问题在于时间戳可能会误导您:

    取决于时间戳的检查
  • 可能受时钟偏斜问题的影响。 (这取决于所涉及的时钟以及如何管理时钟。)
  • 文件时间戳可能会被重置(例如,由“ root”用户执行,从而使文件似乎没有更改。

  • 在不实际更改文件的情况下更改“已修改”的文件时间戳很简单;例如touch

  • 另一方面,如果您使用校验和,则还有其他问题:

      计算文件校验和需要读取整个文件。 (通常,部分校验和不足以检测更改。)某些校验和算法也相对较昂贵。
  • 您还需要知道文件的[[previous校验和是什么。这意味着您需要一种存储方式。那可能只是另一个文件,但是作为同步过程的一部分,您需要一些基础结构来(可靠地)更新该文件。

  • 异或多个校验和会导致您不知道哪些文件已更改的问题。如果一个文件更改,则需要同步所有文件。

  • 从理论上说,有可能更改文件并且MD5校验和相同:2 ^ 128中的概率为1。除非您的安全性至关重要的应用程序,否则您可以打折...。 (请注意,MD5碰撞攻击是实用的

    在某些情况下

  • ;请参见https://en.wikipedia.org/wiki/Collision_attack)>]
  • 另一件事是,我怀疑您正在尝试解决已解决的问题。例如,Linux / Unix rsync实用程序具有使用时间戳或(MD5)校验和来决定需要同步哪些文件的选项。您不需要自己实现所有功能(使用Java)。


    为回应您的

    “我们无权访问旧文件树”

    ,有一个简单的解决方案。每次重新启动时:

    复制文件树将当前文件与您重新引导的副本[[上次

    进行比较。
    1. 就像我在评论中说的那样,请发挥您的想象力。
  • 文件的修改时间在您的情况下有用吗? Md5sum在某些情况下是更精确的方法。

  • 0
    投票
    这是我要从目录中的所有文件生成哈希的例程。

    0
    投票
    DirectoryDigest dd = new DirectoryDigest(); dd.update(csConfigDirPath, ".xml"); String currentPeripheralHash = dd.digest();
    © www.soinside.com 2019 - 2024. All rights reserved.