У меня есть каталог с 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
last_write_time
кажется, есть проблема с каталогами==
в лямбду к <
один лайнер по-прежнему будет отвечать утвердительно, если вы вручную обновили один из файлов до более новой тестовой версии