web-dev-qa-db-fra.com

Comment comparer des parties de fichiers par hash?

J'ai un fichier téléchargé avec succès et un autre téléchargement ayant échoué (uniquement les 100 premiers Mo d'un fichier volumineux) dont je soupçonne qu'il s'agit du même fichier.

Pour vérifier cela, j'aimerais vérifier leurs hachages, mais comme je ne dispose que d'une partie du fichier téléchargé sans succès, je ne souhaite hacher que les premiers mégaoctets ou plus.

Comment puis-je faire cela?

Le système d'exploitation serait Windows, mais j'ai installé cygwin et MinGW.

19
sinned

La création de hachages pour comparer des fichiers a du sens si vous comparez un fichier par rapport à plusieurs, ou si vous comparez plusieurs fichiers les uns par rapport aux autres.

Cela n'a pas de sens de comparer deux fichiers une seule fois: l'effort de calcul des hachages est au moins aussi important que de parcourir les fichiers et de les comparer directement.

Un outil de comparaison de fichiers efficace est cmp:

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

Vous pouvez également le combiner avec dd pour comparer des parties arbitraires (pas nécessairement du début) de deux fichiers, par exemple:

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"
56
Konrad Rudolph

Je suis désolé, je ne peux pas vraiment essayer, mais cette méthode fonctionnera

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

Cela vous donnera les 100 premiers mégaoctets des deux fichiers.

Maintenant, récupérez les hachages:

sha256sum first100mb1.dat && sha256sum first100mb2.dat 

Vous pouvez également l'exécuter directement:

dd if=yourfile.Zip bs=100M count=1 | sha256sum 
dd if=yourotherfile.Zip bs=100M count=1 | sha256sum 
12
davidbaumann

Tout le monde semble suivre la route Unix/Linux avec cela, mais il est facile de comparer 2 fichiers avec des commandes standard Windows:
FC /B file file2

FC est présent sur toutes les versions de Windows NT jamais créées. Et (si je me souviens bien) était également présent sous DOS.
C'est un peu lent, mais cela n'a pas d'importance pour une utilisation ponctuelle.

7
Tonny

Vous pouvez simplement comparer directement les fichiers, avec un programme de diff/hex binaire comme vbindiff . Il compare rapidement les fichiers jusqu'à 4 Go sous Linux et Windows.

Cela ressemble à quelque chose comme ça, seulement avec la différence surlignée en rouge (1B vs 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     │
└──────────────────────────────────────────────────────────────────────────────┘ 
6
Xen2050

Je sais que cela dit pour Bash, mais OP indique également qu'ils ont Windows. Pour ceux qui veulent/ont besoin d’une solution Windows, il existe un programme appelé HxD qui est un éditeur hexadécimal pouvant comparer deux fichiers. Si les fichiers sont de tailles différentes, il sera indiqué si les pièces disponibles sont les mêmes. Et si besoin est, il est capable d'exécuter des sommes de contrôle pour tout ce qui est actuellement sélectionné. C'est gratuit et peut être téléchargé à partir de: le site Web HxD . Je n'ai aucun lien avec le ou les auteurs, je l'utilise depuis des années.

0
Blerg

cmp vous dira quand deux fichiers sont identiques jusqu’à la longueur du fichier le plus petit:

$ 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 vous indique que la comparaison a rencontré un fichier EOF avant de détecter une différence entre les deux fichiers.

0
Jim L.