19

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

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

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

ОС будет Windows, но у меня установлены Cygwin и MinGW.

6 ответов6

56

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

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

Эффективным инструментом сравнения файлов является 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"
12

Мне жаль, что я не могу это попробовать, но этот способ сработает

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 
7

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

ФК присутствует на всех версиях Windows NT. И (если я правильно помню) также присутствовал в DOS.
Это немного медленно, но это не имеет значения для одноразового использования.

6

Вы можете просто напрямую сравнить файлы с помощью бинарной / шестнадцатеричной программы сравнения, такой как vbindiff. Он быстро сравнивает файлы до 4 ГБ в Linux и Windows.

Выглядит примерно так, только с разницей, выделенной красным (1B против 1C):

one                                       
0000 0000: 30 5C 72 A7 1B 6D FB FC  08 00 00 00 00 00 00 00  0\r..m.. ........  
0000 0010: 00 00 00 00                                       ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080: 
0000 0090: 
0000 00A0: 

two        
0000 0000: 30 5C 72 A7 1C 6D FB FC  08 00 00 00 00 00 00 00  0\r..m.. ........  
0000 0010: 00 00 00 00                                       ....               
0000 0020: 
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:                                
0000 00A0:             
┌──────────────────────────────────────────────────────────────────────────────┐
│Arrow keys move  F find      RET next difference  ESC quit  T move top        │
│C ASCII/EBCDIC   E edit file   G goto position      Q quit  B move bottom     │
└──────────────────────────────────────────────────────────────────────────────┘ 
0

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

0

cmp сообщит вам, когда два файла идентичны, вплоть до длины меньшего файла:

$ dd if=/dev/random bs=8192 count=8192 > a
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.514571 secs (130417197 bytes/sec)
$ cp a b
$ dd if=/dev/random bs=8192 count=8192 >> b 
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.512228 secs (131013601 bytes/sec)
$ cmp a b
cmp: EOF on a

cmp сообщает вам, что сравнение обнаружило EOF в файле a до того, как обнаружило разницу между этими двумя файлами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .