Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1879 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  HashCode pour verifier si deux fichiers sont identiques ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

HashCode pour verifier si deux fichiers sont identiques ?

n°1944330
vingtcent
C'est c'laaaa ouiiii !
Posté le 25-11-2009 à 10:56:16  profilanswer
 

Bonjour,
 
j'aimerais vérifier si deux fichier sont identique. Pour cella j'ai écris cette méthode :
 

Code :
  1. static String getMD5(File file)
  2.     {
  3.         String result = null;
  4.         try
  5.         {
  6.             byte[] dataToHash = file.getAbsolutePath().getBytes();
  7.             MessageDigest digest = MessageDigest.getInstance("MD5" );
  8.             digest.update(dataToHash);
  9.             byte[] hashMD5 = digest.digest(dataToHash);
  10.             result = new String(hashMD5);
  11.         }
  12.         catch (NoSuchAlgorithmException e)
  13.         {
  14.             e.printStackTrace();
  15.         }
  16.         return result;
  17.     }


 
Que je teste sur deux fichiers txt identiques (copier/coller) mais dans deux répertoire différents. Or les résultats sont différents pour les deux fichiers.  
 
Où est ce que je me goure ?
 
Merci


Message édité par vingtcent le 25-11-2009 à 10:56:57
mood
Publicité
Posté le 25-11-2009 à 10:56:16  profilanswer
 

n°1944389
brisssou
8-/
Posté le 25-11-2009 à 13:04:18  profilanswer
 

file.getAbsolutePath().getBytes()

 

c'est le chemin du fichier ça

 

du coup tu compares les chemins, qui sont fatalement différents


Message édité par brisssou le 25-11-2009 à 13:04:40

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1944635
Bidem
Posté le 25-11-2009 à 16:09:32  profilanswer
 

Comme l'a dit brisssou, là tu compares les chemins des fichiers et non leur contenu.
 
Attention quand même, une fonction de hashage c'est bien pour déterminer que 2 fichiers sont différents, mais ce n'est pas suffisant pour dire si les 2 fichiers sont identiques...
 
Je m'explique :
 - si les hash de 2 fichiers sont différents alors on peut dire que les 2 fichiers sont différents
 - si les hash de 2 fichiers sont identiques :
     - soit les fichiers sont identiques
     - soit les fichiers sont différents et on a affaire à une collision
 
Donc si les hash sont identiques il faut comparer le contenu des fichiers.

n°1944696
cbeyls
Hail to the King, Baby
Posté le 25-11-2009 à 18:08:47  profilanswer
 

En effet, et comme pour calculer le hash il faut quand même lire le fichier en entier... Autant lire les 2 fichiers en entier, en parallèle, pour faire la comparaison. Bloc par bloc hein, pas besoin de tout stocker en mémoire.

n°1945112
vingtcent
C'est c'laaaa ouiiii !
Posté le 26-11-2009 à 21:03:54  profilanswer
 

cbeyls a écrit :

En effet, et comme pour calculer le hash il faut quand même lire le fichier en entier... Autant lire les 2 fichiers en entier, en parallèle, pour faire la comparaison. Bloc par bloc hein, pas besoin de tout stocker en mémoire.


 
Oui. Mais non. Une des applications serra la recherche de doublons dans mes photos. C'est à dire plusieurs milliers de fichiers.  
 
Mais j'ai trouvé sur le web une classe pour calculer le hash d'un fichier.  

n°1945170
cbeyls
Hail to the King, Baby
Posté le 27-11-2009 à 02:04:09  profilanswer
 

Ok, donc en résumé:
 
Tu calcules le hash de chaque photo une seule fois et tu le stockes quelque part.
Quand une nouvelle photo est ajoutée, si tu remarques qu'une autre photo avait le même hash, tu les compares byte par byte pour vérifier qu'elles sont vraiment identiques.
 
En n'oubliant donc pas que deux photos différentes peuvent avoir le même hash! Heureusement c'est rare donc le nombre de comparaisons byte par byte sera limité.

Message cité 1 fois
Message édité par cbeyls le 27-11-2009 à 02:06:17
n°1945354
sircam
I Like Trains
Posté le 27-11-2009 à 14:54:51  profilanswer
 

À noter :
 
* La gestion de l'exception n'est pas la meilleure - je serais tenté de dire qu'elle n'est pas correcte;
* Détail : getMD5 n'est peut-être pas le meilleur choix de nom de méthode. Un "compute" serait sémantiquement plus précis.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1945515
cbeyls
Hail to the King, Baby
Posté le 28-11-2009 à 06:29:49  profilanswer
 

C'est vrai que la méthode devrait plutôt lever une Exception (même Runtime) plutôt que renvoyer Null sinon bonjour les NPE :)


Message édité par cbeyls le 28-11-2009 à 06:30:02
n°1945521
Bidem
Posté le 28-11-2009 à 09:09:53  profilanswer
 

Humm, pour ce genre d'exception (NoSuchAlgorithmException, CharsetNotFound, ...) qui relèvent plus de l'erreur de programmation ou de configuration, j'ai aussi tendance à les logger et les trapper sans les remonter quand c'est la seule exception de possible de la méthode.

 

Pourquoi s'embêter à mettre une gestion d'exception autour de cette méthode alors qu'on sait pertinemment que ça n'arrivera pas.

 

Mais c'est un autre débat.


Message édité par Bidem le 28-11-2009 à 09:10:17
n°1945568
Bidem
Posté le 28-11-2009 à 14:39:46  profilanswer
 

cbeyls a écrit :

Ok, donc en résumé:

 

Tu calcules le hash de chaque photo une seule fois et tu le stockes quelque part.
Quand une nouvelle photo est ajoutée, si tu remarques qu'une autre photo avait le même hash, tu les compares byte par byte pour vérifier qu'elles sont vraiment identiques.

 

En n'oubliant donc pas que deux photos différentes peuvent avoir le même hash! Heureusement c'est rare donc le nombre de comparaisons byte par byte sera limité.

 


Il n'y même pas besoin de comparer tout le fichier byte à byte en fait.
J'ai fais le test en limitant la comparaison au premier kilo octet des fichiers et ça rend le même résultat.
En fait j'avais le même besoin, donc je me suis amusé à faire le programme qui cherche tous les doubons dans le fichiers images (jpg, gif, png et bmp)

 

En effet, la probabilité que 2 fichiers différents aient à la fois le même hash et commencent de la même façon est très faible, voire nulle.

 

J'ai même essayé avec des valeurs plus petites et ça passe mais le gain en temps n'est pas énorme.

 

J'ai pas beaucoup de photo sur mon PC mais en scannant tous mes disques, je tombe quand même sur 24000 images
dont 8000 doublons... (beaucoup de logos et d'images dans des docs en plusieurs langues)

 

Juste en limitant la comparaison bit à bit, je suis passé d'environ 5 minutes à moins de 2 minutes


Message édité par Bidem le 28-11-2009 à 14:41:22
mood
Publicité
Posté le 28-11-2009 à 14:39:46  profilanswer
 

n°1945588
cbeyls
Hail to the King, Baby
Posté le 28-11-2009 à 18:02:35  profilanswer
 

Je ne suis pas statisticien mais effectivement à chaque byte lu la probabilité de collision est d'autant plus faible et c'est bien possible qu'elle soit infime après comparaison d'1 Ko de données.
La probabilité de collision est encore plus faible en utilisant SHA-1 (160 bits) au lieu de MD5 (128 bits).
 
Bien sûr quand je parle de comparer byte par byte, c'est via un buffer histoire d'accélérer les choses.


Message édité par cbeyls le 28-11-2009 à 18:06:09
n°1972693
jason70v
Posté le 10-03-2010 à 16:21:41  profilanswer
 

vingtcent a écrit :


 
Oui. Mais non. Une des applications serra la recherche de doublons dans mes photos. C'est à dire plusieurs milliers de fichiers.  
 
Mais j'ai trouvé sur le web une classe pour calculer le hash d'un fichier.  


 
Fais tourner !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  HashCode pour verifier si deux fichiers sont identiques ?

 

Sujets relatifs
[VBS] Rechercher des fichiers selon leur nomFichiers .swf dans flux RSS ?
Une plateforme d'échange de fichiers via Internet ?Les fichiers en Java
[FTP] suppression multiple de fichiers?Remonter les fichiers de repertoire
[PHP] Zend PDF - Assembler 2 fichiers PDFComment choisir un logiciel pour traiter des fichiers XML?
Shell : Découper un fichier en plusieurs fichiersChoisir plusieurs fichiers pour un htaccess?
Plus de sujets relatifs à : HashCode pour verifier si deux fichiers sont identiques ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR