【问题标题】:Directory checksum目录校验和
【发布时间】:2018-06-03 08:19:36
【问题描述】:

我有 80 个文件的目录,我想检查目录的校验和。

我想验证目录的内容是否与最新版本匹配。

我使用实时系统,所以它需要高效。

我发现了一些文件校验和功能。

我的问题是:我可以在不循环所有文件的情况下对目录进行校验和吗?

【问题讨论】:

  • "我的问题是我可以在不循环所有文件的情况下对目录执行校验和吗?"这取决于“目录校验和”的含义
  • 我想在运行时读取目录,并验证内容是否有效。
  • 您需要验证每个文件的内容吗?如果是,那么您将必须计算每个文件的校验和。
  • 通常我需要验证每个文件,这就是为什么我试图了解我是否可以在目录级别进行验证。
  • 我可以在不循环所有文件的情况下对目录进行校验和吗? 不可以。您必须阅读每个文件。计算校验和,然后将校验和存储在某个文件中并比较以供后续执行。

标签: c++ hash md5 checksum crc


【解决方案1】:

我不确定您的申请。 md5 校验和通常用于准确性优于速度的情况(或为犯规设置额外障碍。)

在速度为王的构建系统中,文件日期通常用于评估目录是否相等。例如,假设最新目录是:filesystem::path foo,而有问题的目录是:filesystem::path bar,您可以简单地评估:

equal(filesystem::directory_iterator(foo), filesystem::directory_iterator(), filesystem::directory_iterator(bar), filesystem::directory_iterator(), [](const auto& lhs, const auto& rhs) { return filesystem::last_write_time(lhs) == filesystem::last_write_time(rhs); })

Live Example

关于这个单行的几点说明:

  1. 这不是一个递归函数,它只计算foobar 内的日期
  2. 如果您正在使用目录,Visual Studio's implementation of last_write_time seems to have an issue with directories
  3. 例如在构建系统中,这比 md5 校验和具有巨大优势,我可以将 lambda 中的 == 更改为 <,如果您手动将其中一个文件更新为更新的测试版本

【讨论】:

    【解决方案2】:

    一种可能的解决方案是维护一个特殊(隐藏)文件,在其中保存每个文件的修改日期时间和哈希值,并在文件更改时更新它。然后将该文件的哈希作为目录的哈希。这不会阻止计算所有文件的校验和,但会减少文件更改时的工作量。如果您需要创建目录的快照,那么您别无选择,只能按特定顺序对每个文件进行校验和。

    注意:您可以考虑避免使用加密哈希,除非您强烈要求它们不能被伪造。加密哈希相当缓慢且效率低下,这是故意的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      相关资源
      最近更新 更多