Accélérer un checksum

cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 juillet 2013 - 15 juil. 2013 à 14:13
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 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.

Cordialement.

2 réponses

Utilisateur anonyme
16 juil. 2013 à 13:38
Bonjour,

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).

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_lebuff Messages postés 39 Date d'inscription lundi 15 août 2011 Statut Membre Dernière intervention 17 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.

Cordialement.
0
Rejoignez-nous