![]() |
MD5-Prüfroutine für Delphi 10.2
Kennt jemand von Euch eine (schnelle) Prüfroutine, die auch Dateien größer als 4GB verarbeitet, unter Delphi 10.2?
Habe bislang eine unit von Matthias Fichtner verwendet, die kann aber nur Dateien < 4GB (nutzt ein FileMapping), eine andere Variante hat zwar bislang unter XE7 funktioniert, geht aber unter Delphi 10.2 nicht. Habe jetzt keine Lust großartige Ursachenforschung zu betreiben, wenn es etwas fertiges (gerne kostenlos) gibt, will ich das Rad hier nicht noch mal neu erfinden. |
AW: MD5-Prüfroutine für Delphi 10.2
Entweder mit den Jedis
Delphi-Quellcode:
Oder mit Wolfgang Ehrhardt Hash-Units
uses
IdHashMessageDigest, IdHash; function MD5File(const FileName: string): string; var IdMD5: TIdHashMessageDigest5; FileStream: TFileStream; begin // if not TFile.Exists(FileName) then // Exit; try IdMD5 := TIdHashMessageDigest5.Create; FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Result := Trim(AnsiLowerCase(IdMD5.HashStreamAsHex(FileStream))); finally FileStream.Free; IdMD5.Free; end; except end; end; Nur bei letzterer Möglichkeit weiß ich nicht, wie man die Prüfsumme einer Datei erstellt. |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
@Harry: Wenn es schnell sein soll, ist aber CRC32 besser. Was ist der Zweck Deiner Prüfsumme? |
AW: MD5-Prüfroutine für Delphi 10.2
Indy. Meine ich doch. Habe mich geirrt.
Zitat:
Und die sind ja für Schnelligkeit bekannt. Nur bei Verwendung der Units ist darauf zu achten, die Unit Hash umzubenennen. Der Fehler wurde doch angeblich von Embarcadero behoben. Denn wenn man Hash von Wolfgang Erhardt in den uses stehen hat, sucht der Compiler nach System.Hash. |
AW: MD5-Prüfroutine für Delphi 10.2
Danke für die Antworten. Ich benötige die MD5-Funktionalität, um mit meinem Dateimanager z.B. aus dem Netz geladene Dateien zu testen, ob da mit dem Download alles funktioniert hat.
Habe die Indy-Lösung nun mal mit einer 5,3 GB großen Datei getestet (liegt auf einer Festplatte, die per 1GB-Netz verbunden ist), da hat es 4 Minuten gedauert, bis das (richtige) Ergebnis kam. |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
CRC32 ist für dein Vorhaben eher ungeeignet soweit ich weiß. ![]() |
AW: MD5-Prüfroutine für Delphi 10.2
Habe mal schnell ein Linux-Testprogramm gemacht (da mein Windows virtuell in Virtual-Box verwendet wird), da dauert das (immer noch Festplatte, aber kein Netz) ca. 1:10 Minuten. Damit kann ich leben... (alleine das Kopieren bzw. Lesen einer Datei in dieser Größe dauert mind. 30 Sekunden, da ist das denke ich schon recht schnell).
Also danke für den schnellen Tip! |
AW: MD5-Prüfroutine für Delphi 10.2
Du wärst noch schneller dran, wenn du Wolfgang Erhardts Units verwenden und einen Stream hashen würdest.
Hier für einen String. für einen Stream weiß ich nicht wie es funktioniert
Delphi-Quellcode:
function MD5(const s: UTF8String): string;
var Context: THashContext; Hash: TMD5Digest; begin MD5Init(Context); MD5Update(Context, PAnsiChar(s), Length(s) * SizeOf(Byte)); MD5Final(Context, Hash); Result := string(Mem_Util.HexStr(@Hash, SizeOf(Hash))); end; |
AW: MD5-Prüfroutine für Delphi 10.2
es gibt noch die DCP Sachen, die haben auch MD5 mit drin, sind open source und nicht so vollgeladen wie die Indy Komponenten.
Da geht es dann so :
Code:
uses DCPmd5;
function FileMD5(const AFileName: string): String; var DCP_md51: TDCP_md5; aStream: TFileStream; Buffer: array[0..16383] of Byte; Read, i : Integer; HashDigest: array of byte; begin DCP_md51 := TDCP_md5.Create(nil); DCP_md51.Init; aStream := TFileStream.Create(AFileName, fmOpenRead); Repeat Read := aStream.Read(Buffer, Sizeof(Buffer)); DCP_md51.Update(Buffer, Read) Until Read <> Sizeof(Buffer); aStream.Free; SetLength(HashDigest, DCP_md51.HashSize div 8); DCP_md51.Final(HashDigest[0]); // Read the MD5 Result := EmptyStr; for i := 0 to Length(HashDigest) - 1 Do // end convert into hex Result := Result + IntToHex(HashDigest[i], 2); DCP_md51.Free; end; |
AW: MD5-Prüfroutine für Delphi 10.2
Um das zu kompletieren. Gibt es jemanden der eine funktionierende Implementierung (Datei / Stream hashen) mit den WE-Units fertig bekommt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz