C++ 目录校验和

C++ 目录校验和,c++,hash,md5,checksum,crc,C++,Hash,Md5,Checksum,Crc,我有一个包含80个文件的目录,我想检查目录的校验和 我想验证目录的内容是否与最新版本匹配 我使用实时系统,所以它需要高效 我找到了一些文件校验和函数 我的问题是:我能在不循环所有文件的情况下对目录进行校验和吗 一种可能的解决方案是维护一个特殊的(隐藏的)文件,其中保存每个文件的修改日期时间和哈希,并在文件更改时更新。然后将该文件的散列作为目录的散列。这不会阻止计算所有文件的校验和,但会减少文件更改时的工作量。如果您需要创建目录的快照,那么您别无选择,只需要按特定顺序对每个文件进行校验和 注:你可

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

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

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

我找到了一些文件校验和函数


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

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


注:你可以考虑避免密码散列,除非你有很强的要求不能伪造。加密散列非常缓慢和低效,这是故意的。

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


注:你可以考虑避免密码散列,除非你有很强的要求不能伪造。加密哈希非常缓慢且效率低下,这是故意的。

我不确定您的应用程序。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); })

关于这一行的一些注意事项:

  • 这不是一个递归函数,它只计算
    foo
    bar
  • 如果您正在使用目录

  • 例如,在构建系统中,这比md5校验和具有巨大的优势,我可以将lambda中的
    ==
    更改为
    ,我不确定您的应用程序。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); })
    

    关于这一行的一些注意事项:

  • 这不是一个递归函数,它只计算
    foo
    bar
  • 如果您正在使用目录

  • 例如,在构建系统中,这比md5校验和有着巨大的优势,我可以将lambda中的
    =
    更改为
    “我的问题是我可以在不循环所有文件的情况下对目录进行校验和吗?”这取决于你所说的“目录校验和”的意思,我想在运行时读取目录,并验证内容是否有效。是否需要验证每个文件的内容?如果是,则必须计算每个文件的校验和。一般来说,我需要验证每个文件,这就是为什么我试图了解是否可以在目录级别执行校验和。我可以在不循环所有文件的情况下对目录执行校验和吗?不,您必须读取每个文件。计算校验和,然后将校验和存储在某个文件中,并比较后续执行。“我的问题是,我可以在不循环所有文件的情况下对目录执行校验和吗?”这取决于您所说的“目录校验和”是什么意思。我想在运行时读取目录,并验证内容是否有效。是否需要验证每个文件的内容?如果是,则必须计算每个文件的校验和。一般来说,我需要验证每个文件,这就是为什么我试图了解是否可以在目录级别执行校验和。我可以在不循环所有文件的情况下对目录执行校验和吗?不,您必须读取每个文件。计算校验和,然后将校验和存储在某个文件中,并进行比较以供后续执行。