#c #linux #md5sum
#c #linux #md5sum
Вопрос:
У меня проблема с вычислением md5sum. У меня есть средство восстановления, которое архивирует метаданные файла (inode), а также вычисляет значения md5 из этих файлов и сохраняет их в базе данных sqlite во время установки. Когда файл удаляется / deleted . инструмент восстанавливает удаленный файл, используя метаданные из sqlite-db.Он восстанавливает файл.Теперь я хотел убедиться, что восстановленный файл точно такой же, как исходный файл.Таким образом, повторно вычисляется md5sum восстановленных файлов, как показано ниже. Проблема в том, что, как ни странно, для нескольких файлов я вижу (используя cat), содержимое файла точно такое же (как и до его удаления), и команда stat показывает тот же результат (за исключением другого номера индекса), но md5sum отличается.
Следующие 2 файла имеют одинаковое содержимое — таким образом, различный номер индекса не влияет на значение md5sum.
764efa883dda1e11db47671c4a3bbd9e /test/hi1.txt
764efa883dda1e11db47671c4a3bbd9e /test/hi.txt
Есть мысли, как мне следует поступить с этим?
char file_location[512] = {0};
char md5_cmd[512], md5sum[34];
FILE *pf;
//some recovery stuff goes here...
//Recompute md5 of recovered file
memset(md5_cmd, '', 512);
sprintf(md5_cmd, "md5sum %s", file_location);
pf = popen(md5_cmd, "r");
if (!pf) {
fprintf(stderr,"Could not open pipe");
return;
}
// get data
fgets(md5sum, 34, pf);
if (pclose(pf) != 0)
fprintf(stderr, "Error: close Failed.");
fprintf(stdout, "Md5sum is %s", md5sum);
Комментарии:
1.
,I can see (using cat)
Что, если есть вещи, которые вы не видите? Управляющие символы, пробелы вместо табуляции, новая строка в конце одного файла? Сделайте шестнадцатеричный дамп для файлов и сравните шестнадцатеричное значение.2. Почему проблема в том, что файлы с точно таким же содержимым имеют одинаковый MD5?
3. Или просто другая кодировка. MD5 работает в двоичном представлении.
4. @nos, спасибо, это хорошее предложение. Я попробую это первым.@ Джонас, нет, проблема в том, что иногда файлы с одинаковым содержимым имеют разные значения md5. @ Спасибо, Владислав, я прочитаю больше о его фактическом представлении.
5. Другой (очень неприятный) вариант заключается в том, что в системе недостаточно памяти, и процесс md5sum иногда попадает в поврежденные ячейки памяти, в результате чего «проверенные» данные перемещаются при вычислении суммы. Такие вещи случаются! Для изменения значения md5sum для одних и тех же входных данных нет / нет / веской причины. Его цель не в том, чтобы меняться. И наоборот, два разных файла действительно могут иметь одинаковое значение md5. Это называется коллизией хэшей и маловероятно, но возможно и является естественным свойством функций хэширования.
Ответ №1:
Вы не можете достоверно сравнить содержимое файла с cat
. Таким образом (если вы не используете cat -A
или что-то подобное), может быть много различий, которые остаются незамеченными: пробелы против табуляции, пробелы в конце строк и т.д.
Вы должны сравнивать файлы с
diff -u fileA fileB
или
cmp fileA fileB
.
Комментарии:
1. Спасибо, ребята, использование hexdump и diff действительно показывает, что файл действительно отличается, они (содержимое) не такие, как я думал.