PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprint()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprint()

Beitrag 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
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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! <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprin

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB4.2: ExamineMD5Fingerprint() und ExamineSHA1Fingerprin

Beitrag 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
a²+b²=mc²
Antworten