Как сравнить части файлов по хешу?

Как сравнить части файлов по хешу?

У меня есть один успешно загруженный файл и еще один, загрузка которого завершилась неудачей (только первые 100 МБ большого файла), и я подозреваю, что это один и тот же файл.

Чтобы убедиться в этом, я хотел бы проверить их хэши, но поскольку у меня есть только часть неудачно загруженного файла, я хочу хэшировать только первые несколько мегабайт или около того.

Как мне это сделать?

Операционная система — Windows, но у меня установлены Cygwin и MinGW.

решение1

Создание хэшей для сравнения файлов имеет смысл, если вы сравниваете один файл с несколькими или сравниваете много файлов друг с другом.

Это не имеет смысла, если сравнивать два файла только один раз: усилия по вычислению хэшей по меньшей мере такие же, как и при прямом обходе файлов и их сравнении.

Эффективный инструмент сравнения файлов cmp:

cmp --bytes $((100 * 1024 * 1024)) file1 file2 && echo "File fragments are identical"

Вы также можете объединить его с ddдля сравнения произвольных частей (не обязательно с начала) двух файлов, например:

cmp \
    <(dd if=file1 bs=100M count=1 skip=1 2>/dev/null) \
    <(dd if=file2 bs=100M count=1 skip=1 2>/dev/null) \
&& echo "File fragments are identical"

решение2

Извините, я не могу это попробовать, но этот способ сработает.

dd if=yourfile.zip of=first100mb1.dat bs=100M count=1
dd if=yourotherfile.zip of=first100mb2.dat bs=100M count=1

Это даст вам первые 100 мегабайт обоих файлов.

Теперь получим хеши:

sha256sum first100mb1.dat && sha256sum first100mb2.dat 

Вы также можете запустить его напрямую:

dd if=yourfile.zip bs=100M count=1 | sha256sum 
dd if=yourotherfile.zip bs=100M count=1 | sha256sum 

решение3

Похоже, все в этом случае выбирают путь Unix/Linux, но простое сравнение двух файлов можно легко выполнить с помощью стандартных команд Windows:
FC /B file file2

FC присутствует в каждой когда-либо созданной версии Windows NT. И (если я правильно помню) также присутствовал в DOS.
Он немного медленный, но это неважно для одноразового использования.

решение4

Я знаю, что это написано для Bash, но автор OP также утверждает, что у них есть Windows. Для тех, кто хочет/требует решения для Windows, есть программа HxD, которая является шестнадцатеричным редактором, который может сравнивать два файла. Если файлы имеют разные размеры, он скажет, одинаковы ли доступные части. И если нужно, он способен запускать контрольные суммы для всего, что выбрано в данный момент. Он бесплатный и может быть загружен с:сайт HxD. Я не имею никакого отношения к автору(ам), я просто пользуюсь им уже много лет.

Связанный контент