разные значения md5 для одного и того же содержимого файла?

#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 действительно показывает, что файл действительно отличается, они (содержимое) не такие, как я думал.