目录校验和

时间:2017-12-20 17:46:22

标签: c++ hash md5 checksum crc

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

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

我使用实时系统,因此需要高效。

我找到了一些文件校验和功能。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

我不确定你的申请。 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. 中的日期
  3. 如果 使用目录Visual Studio's implementation of last_write_time seems to have an issue with directories
  4. 在构建系统中,例如,这比md5校验和具有巨大的优势,我可以将lambda中的==更改为<如果你手动更新了一个,那么一个班轮仍然会肯定地回复的文件到较新的测试版本