Hash fichier pour comparaison

Hash fichier pour comparaison - Java - Programmation

Marsh Posté le 04-01-2007 à 10:14:25    

Salut,  
 
J'aimerai savoir s'il existe une méthode assez simple en Java pour comparer le contenu de deux fichiers (quelque soit leur type). Après avoir effectué des recherches j'ai cru comprendre qu'il fallait utiliser le hachage.
Est-ce que la fonction MessageDigest peut être utilisée sur des fichiers (et pas uniquement sur des String comme j'ai pu le voir sur la plupart des exemples) ?
Quelle solution me proposeriez-vous ?
 
Merci.


Message édité par dessda le 04-01-2007 à 10:40:42
Reply

Marsh Posté le 04-01-2007 à 10:14:25   

Reply

Marsh Posté le 04-01-2007 à 11:26:09    

C'est bon je crois que je viens de trouver un truc intéressant !  
 

Code :
  1. public long calculChecksum(String adresse_fichier) {
  2.     try {
  3.         FileInputStream fis = new FileInputStream(adresse_fichier);
  4.         CheckedInputStream cis = new CheckedInputStream(fis, new Adler32());
  5.         byte[] tempBuf = new byte[128];
  6.         while (cis.read(tempBuf) >= 0) {}
  7.         long checksum = cis.getChecksum().getValue();
  8.   return checksum;        
  9.     } catch (IOException e) {
  10.      System.out.println("Error occuring during the Checksum calcul" );
  11.      return 0;
  12.     }
  13. }


 
Il suffit ensuite de comparer le checksum des deux fichiers à comparer et c'est bon !  
 
Par contre est-ce que quelqu'un connait la fiabilité de Adler32() qui utilise CRC32 ?

Reply

Marsh Posté le 04-01-2007 à 11:44:06    

sinon, y'a aussi la méthode du md5...

Reply

Marsh Posté le 04-01-2007 à 12:11:22    

Oui j'y pensais, mais je ne sais pas quelles sont les grandes différences entre CRC32, MD5 et SHA1 ? Et laquelle serait la mieux adaptée à mon problème ?

Reply

Marsh Posté le 04-01-2007 à 12:55:19    

je pense que côté résultat, ça doit se valoir. Je pense qu'il faut plus regarder du côté du temps que chaque algo prend lorsqu'il est appliqué sur un gros fichier. Parce que si c'est pour avoir le même résultat lors de la comparaison de 2 ficheirs de 700 Mo, mais qu'avec le sha1, faut 1h alors que pour le md5, faut 1mn, ben y'a pas photo...
Tu peux regarder aussi du côté des probas de collisions. Quel algo à la proba la plus faible.


Message édité par rufo le 04-01-2007 à 12:56:01
Reply

Marsh Posté le 04-01-2007 à 13:00:16    

si t'as les deux fichiers, à part gacher du CPU et perdre ton temps tu ne fais rien. Compare le données et c'est tout. Tu lis bloc par bloc, et tu compares les bloc. Dès que c'est plus pareil, tu stoppes.

Reply

Marsh Posté le 04-01-2007 à 13:03:47    

Déjà, y'a un premier test à faire, c'est vérifier si les 2 fichiers ont la même taille.

Reply

Marsh Posté le 04-01-2007 à 14:16:46    

+1 Taz et rufo. Le checksum n'a pas d'intérêt ici. Tu trouveras des libs toutes faites et tu ne devras même pas te farcir les 10 lignes de code (je pousse un peu la flemme, j'avoue).

Reply

Marsh Posté le 04-01-2007 à 17:22:01    

J'ai fais des tests avec CRC32 (via Adler32) et avec MD5/SHA1 (via MessageDigest) sur un fichier d'environ 30Mo et voici les résultats :  
 
- POUR CRC32 le temps d'exécution est d'environ 1 seconde

Code :
  1. Taille f1 = 31118.77734375Ko
  2. Checksum f1 = 2056409882
  3. Temps d'execution f1 = 1047ms
  4. Taille f2 = 31118.77734375Ko
  5. Checksum f2 = 2056409882
  6. Temps d'execution f2 = 984ms


 
- POUR MD5 le temps d'exécution explose : + de 7,5 secondes !! (les temps sont similaires avec SHA1)

Code :
  1. Taille f1 = 31118.77734375Ko
  2. MessageDigest f1 = 00 00 C8 5A E5 01 00 00 05 06 00 00 00 00 94 02 94 02 3E E0
  3. Temps d'execution f1 = 7563ms
  4. Taille f2 = 31118.77734375Ko
  5. MessageDigest f2 = 00 00 C8 5A E5 01 00 00 05 06 00 00 00 00 94 02 94 02 3E E0
  6. Temps d'execution f2 = 8204ms


 
Je vais donc en effet me pencher sur la solution du diff en comparant le contenu sans faire de hachage ! Connaissez-vous une méthode rapide (à implémenter et à exécuter) pour le faire ?

Reply

Marsh Posté le 04-01-2007 à 17:55:33    

déjà dit :o

Reply

Marsh Posté le 04-01-2007 à 17:55:33   

Reply

Marsh Posté le 04-01-2007 à 21:54:55    

Déjà répondu!!! :fou:


Message édité par sircam le 04-01-2007 à 21:55:10

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed