Checksummen von Dateien erstellen

    • Offizieller Beitrag

    Ich bin gerade dabei ein Programm zum synchronisieren von Verzeichnissen zu erstellen.
    Dafür benötige ich eine Funktion zum vergleichen des Inhalts der Dateien. Wenn der Dateiname gleich ist und die Dateigröße gleich ist, kann ja immer noch der Dateiinhalt unterschiedlich sein.
    Deshalb muss ich eine Checksumme für die Dateien erstellen. Nun habe ich mit _Crypt_HashFile experimentiert:

    Spoiler anzeigen
    [autoit]


    #include <Crypt.au3>
    _Crypt_Startup()
    Global $iTimer, $sFile = @AutoItExe

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $sChecksum = _Crypt_HashFile($sFile, $CALG_MD2)
    ConsoleWrite('MD2 = ' & TimerDiff($iTimer) & @CR)

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $sChecksum = _Crypt_HashFile($sFile, $CALG_MD4)
    ConsoleWrite('MD4 = ' & TimerDiff($iTimer) & @CR)

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $sChecksum = _Crypt_HashFile($sFile, $CALG_MD5)
    ConsoleWrite('MD5 = ' & TimerDiff($iTimer) & @CR)

    [/autoit] [autoit][/autoit] [autoit]

    $iTimer = TimerInit()
    $sChecksum = _Crypt_HashFile($sFile, $CALG_SHA1)
    ConsoleWrite('SHA1 = ' & TimerDiff($iTimer) & @CR)

    [/autoit] [autoit][/autoit] [autoit]

    _Crypt_Shutdown()

    [/autoit]


    Bei mir ist der MD4-Algorithmus am schnellsten = rund 12 ms. Das ist aber immer noch eine relativ lange Zeit für diese "kleine" Datei.
    Gibt es da nicht vielleicht eine schnellere Methode? Oder muss ich damit leben?

  • Mit dieser Dll ist MD5 etwa 20% schneller: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    [autoit]

    Global $hDLL_MD5 = DllOpen(@ScriptDir & "\MD5.dll")

    [/autoit][autoit][/autoit][autoit]

    Func _FileCreateMD5($sFile)
    Local $tMD5 = DllStructCreate("char[32];")
    Local $aResult = DllCall($hDLL_MD5, "int", "FileCreateMD5", "str", $sFile, "ptr", DllStructGetPtr($tMD5))
    If @error Then Return SetError(1, 1, "")
    Return SetError($aResult[0], 0, DllStructGetData($tMD5, 1))
    EndFunc ;==>_FileCreateMD5

    [/autoit]

    FreeBasic-Sourcecode hätte ich dazu auch

    E

    Edit: bei vielen kleinen Dateien, lässt sich auch noch so Zeit sparen:

    [autoit]

    Global $hDLL_MD5 = DllOpen(@ScriptDir & "\MD5.dll")
    Global $tMD5 = DllStructCreate("char[32];")
    Global $pMD5 = DllStructGetPtr($tMD5)

    [/autoit][autoit][/autoit][autoit]

    Func _FileCreateMD5($sFile)
    Local $aResult = DllCall($hDLL_MD5, "int", "FileCreateMD5", "str", $sFile, "ptr", $pMD5)
    Return DllStructGetData($tMD5, 1)
    EndFunc

    [/autoit]