2009-04-30 4 views
11

J'utilise le code suivant pour calculer MD5SUM d'un fichier -Computing MD5SUM de gros fichiers en C#

byte[] b = System.IO.File.ReadAllBytes(file); 
string sum = BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(b)); 

Cela fonctionne bien normalement, mais si je rencontre un gros fichier (~ 1 Go) - par exemple une image iso ou un fichier DVD VOB - je reçois une exception Out of Memory. Cependant, je suis capable de calculer le MD5SUM dans cygwin pour le même fichier en environ 10 secondes.

S'il vous plaît suggérer comment puis-je obtenir ce qui fonctionne pour les gros fichiers dans mon programme.

Merci

Répondre

29

Je suggère d'utiliser la méthode:

MD5CryptoServiceProvider.ComputeHash(Stream) 

et juste passer dans un flux d'entrée ouvert sur votre dossier. Cette méthode sera presque pas lire dans le fichier entier en mémoire en une seule fois.

Je note également que dans la plupart des implémentations de MD5, il est possible d'ajouter byte[] des données dans la fonction digest un morceau à la fois, puis de demander le hachage à la fin.

+3

Oui. Mono implémente en fait ComputeHash (Stream) en lisant de façon itérative dans un octet [4096] (http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/corlib/System.Security.Cryptography/HashAlgorithm.cs? révision = 107126 & view = markup). Je m'attendrais à ce que la mise en œuvre de MS soit très similaire. En général, l'utilisation de ReadAllBytes signifie probablement que vous faites quelque chose de mal. Même pour les fichiers courts, l'utilisation d'un Stream est plus élégante. –

+0

C'est assez mignon. J'ai essayé des solutions simples à partir d'autres messages sur la lecture à un flux de mémoire, etc, mais ils semblaient tous échouer pour les fichiers extrêmement volumineux. Cela fonctionne parfaitement et c'est super simple. Merci :) – mrduclaw

Questions connexes