Seite 1 von 1

PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprint()

Verfasst: 14.03.2008 10:36
von Kiffi
Hallö,

bei den vielen Neuerungen, die die PB4.2 Beta mit sich gebracht hat, sind
(zumindest für mich) einige der neuen Features im allgemeinen Trubel
untergegangen.

Wer den MD5-Hash einer Datei berechnen lassen möchte, der kann dies
unter PB mit MD5FileFingerprint() bewerkstelligen. Problematisch wird es
allerdings, wenn es um sehr große Dateien (beispielsweise *.ISOs)
handelt. MD5FileFingerprint() lädt nämlich zur Berechnung die gesamte
Datei an einem Stück in den Speicher und bei einem 3GB-ISO kann es da
schon mal recht knapp im RAM werden.

Ab PB 4.2 Beta steht uns ExamineMD5Fingerprint() zur Verfügung. Hiermit
kann eine Datei (beispielsweise mittels ReadFile() und ReadData()) in
kleinen Portionen in den Speicher geladen und berechnet werden.

Code: Alles auswählen

#MemBuffSize = 4096
#MD5 = 1
  
If ExamineMD5Fingerprint(#MD5)
  
  FF = ReadFile(#PB_Any, "D:\fettes.iso")
  
  If FF
    
    MemBuff = AllocateMemory(#MemBuffSize)
    
    While Not Eof(FF)
      
      MemLen = ReadData(FF, MemBuff, #MemBuffSize)
      
      NextFingerprint(#MD5, MemBuff, MemLen)
      
    Wend
    
    FreeMemory(MemBuff)
    
    CloseFile(FF)
    
    MessageRequester("", FinishFingerprint(#MD5))
    
  Else
    
    ; Datei konnte nicht geöffnet werden
    
  EndIf
  
  ; ExamineMD5Fingerprint konnte nicht durchgeführt werden
  
EndIf
wer indes einen SHA1-Hash generieren lassen möchte, verwendet
ExamineSHA1Fingerprint():

Code: Alles auswählen

#MemBuffSize = 4096
#SHA1 = 1

If ExamineSHA1Fingerprint(#SHA1)
  
  FF = ReadFile(#PB_Any, "D:\fettes.iso")
  
  If FF
    
    MemBuff = AllocateMemory(#MemBuffSize)
    
    While Not Eof(FF)
      
      MemLen = ReadData(FF, MemBuff, #MemBuffSize)
      
      NextFingerprint(#MD5, MemBuff, MemLen)
      
    Wend
    
    FreeMemory(MemBuff)
    
    CloseFile(FF)
    
    MessageRequester("", FinishFingerprint(#SHA1))
    
  Else
    
    ; Datei konnte nicht geöffnet werden
    
  EndIf
  
  ; ExamineSHA1Fingerprint konnte nicht durchgeführt werden
  
EndIf
Grüße ... Kiffi

Verfasst: 14.03.2008 13:19
von AND51
Habs gleich mal getestet, recht herzlichen Dank dafür!
Hatte mal unter 3.94 MD5FileFingerprint() benutzt und schon damals festgestellt, dass Dateien mit einer Größe von 20 MB und größer auffallend langsam bearbeitet werden.

Mit deiner Möglichkeit ist es sogar möglich, noch gleich Fortschrittsanzeigen (Restdauer, Geschwindigkeit in Bytes, ...), Abbruchmöglichkeiten und Callbacks einzubauen! Danke nochmal! :allright:

Verfasst: 14.03.2008 13:22
von Kiffi
AND51 hat geschrieben:Danke nochmal! :allright:
Der Dank geht an Fred & freak. Ich habe lediglich einen kleinen Code
gepostet, der zeigt, wie die PB-Befehle umzusetzen sind :-)

Grüße ... Kiffi

Verfasst: 14.03.2008 13:30
von AND51
Dann bedanke ich mich hiermit natürlich auch noch mal bei denen, klar! :allright:
Allerdings warte ich schon sehnsüchtig auf die neue Dokumentation, auchwenn sie nur in Englisch ist, weil ich keine Lust habe, allein herausfinden zu müssen, wie die Befehle funktionieren.

Deshalb kommt dein Code sehr gelegen! <)

Re: PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprin

Verfasst: 14.03.2008 13:30
von freak
Kiffi hat geschrieben:Wer den MD5-Hash einer Datei berechnen lassen möchte, der kann dies
unter PB mit MD5FileFingerprint() bewerkstelligen. Problematisch wird es
allerdings, wenn es um sehr große Dateien (beispielsweise *.ISOs)
handelt. MD5FileFingerprint() lädt nämlich zur Berechnung die gesamte
Datei an einem Stück in den Speicher und bei einem 3GB-ISO kann es da
schon mal recht knapp im RAM werden.
MD5FileFingerprint() lädt die Datei auch nur in Blöcken. (ca 1mb buffer)
Die ganze Datei wird nicht in den Speicher geladen.

Re: PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprin

Verfasst: 14.03.2008 13:53
von Kiffi
freak hat geschrieben:MD5FileFingerprint() lädt die Datei auch nur in Blöcken. (ca 1mb buffer)
Danke für die Info! Wieder was gelernt :-)

@André: Kannst Du das in der Hilfe ergänzen? Danke!
AND51 hat geschrieben:Mit deiner Möglichkeit ist es sogar möglich, noch gleich Fortschrittsanzeigen
(Restdauer, Geschwindigkeit in Bytes, ...), Abbruchmöglichkeiten und
Callbacks einzubauen!
na, dann war mein Code wenigstens nicht ganz umsonst ;-)

Grüße ... Kiffi