cs_lebuff
Messages postés39Date d'inscriptionlundi 15 août 2011StatutMembreDernière intervention17 juillet 2013
-
15 juil. 2013 à 14:13
cs_lebuff
Messages postés39Date d'inscriptionlundi 15 août 2011StatutMembreDernière intervention17 juillet 2013
-
16 juil. 2013 à 19:48
Bonjour tout le monde,
Je réalise actuellement un programme en VB.NET qui fait un checksum de tous les fichiers du dossier dans lequel il est situé.
Mon but est d'optimiser le checksum qui est actuellement trop long. Pour cela j'ai essayé différences fonctions, j'ai réalisé
un checksum SHA-1, MD5 et CRC32 dans le but de comparer leurs différentes vitesses d'exécution. A ma surprise celle-ci est la
même pour ces différentes méthodes de hashage.
Voici l'exemple d'une fonction que j'utilise pour le checksum SHA-1 (empruntée à un contributeur) :
Public Function SHA1_FromFile2(ByVal file As String) As String
If IO.File.Exists(file) Then
Dim stram As System.IO.FileStream = Nothing
Try
Dim check As New System.Security.Cryptography.SHA1CryptoServiceProvider
stram = IO.File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim somme As Byte() = check.ComputeHash(stram)
Dim ret As String = ""
For Each a As Byte In somme
If (a < 16) Then
ret += "0" + a.ToString("X")
Else
ret += a.ToString("X")
End If
Next
Return ret
Catch ex As Exception
Exit Try
Finally
If stram IsNot Nothing Then stram.Close()
End Try
Else
Return ""
End If
Return ""
End Function
Lors du checksum MD5 ou CRC32 le temps d'exécution est le même : de l'ordre de 35 secondes pour un dossier contenant plusieurs fichiers d'une taille globale inférieure à 1 go.
A mon avis le fait que la durée soit la même malgré l'utilisation d'autres fonctions de hashage vient du fait que dans tous les cas, le fichier, dont l'empreinte SHA-1, MD5 ou CRC32 est obtenue, est lu en entier par le programme. Ce qui explique pourquoi chaque méthode pour réaliser le checksum prend la même durée.
Le problème viendrait donc de cette ligne :
Dim stram As System.IO.FileStream = Nothing
J'ai essayé de me renseigner un peu et j'ai entendu parler de cette fonction en C#: BufferedStream
Je ne sais pas trop de quel côté chercher pour améliorer la vitesse du checksum, est-ce que lire qu'une partie du fichier serait suffisant pour savoir si celui-ci a été modifié ou non ?
Comment cela se fait il qu'un checksum CRC32 dure autant de temps qu'un checksum SHA-1 ?
Je suis ouvert à toutes remarques pouvant améliorer la vitesse du checksum.
Un checksum sur 1Go de fichiers prendra forcément du temps, je ne pense pas qu'en C# ce sera beaucoup plus rapide.
Ce que tu pourrais essayer c'est la méthode recurssive comme pour la recherche de fichiers, tu peux t'inspirer sur ce bout de code:
Sub DirSearch(ByVal sDir As String)
Dim d As String
Dim f As String
Try
For Each d In Directory.GetDirectories(sDir)
For Each f In Directory.GetFiles(d, txtFile.Text)
lstFilesFound.Items.Add(f)
Next
DirSearch(d)
Next
Catch excpt As System.Exception
Debug.WriteLine(excpt.Message)
End Try
End Sub
Une autre solution serait de lire la taille exacte en octets des fichiers, et de cette façon connaitre si changements il y a eu (à tester).
cs_lebuff
Messages postés39Date d'inscriptionlundi 15 août 2011StatutMembreDernière intervention17 juillet 2013 16 juil. 2013 à 19:48
Bonjour à vous, tout d'abord merci de votre réponse. Alors en effet oui je récupère la taille exacte en octets des fichiers.
Mais le fait que la taille d'un fichier soit la même ne garantit pas que celui-ci n'a pas été modifié non ?
Pour ce qui est de la méthode récursive je ne connaissais pas je vais essayer de me pencher dessus.