Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   MD5-Prüfroutine für Delphi 10.2 (https://www.delphipraxis.net/194472-md5-pruefroutine-fuer-delphi-10-2-a.html)

Harry Stahl 26. Nov 2017 14:15

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.

LTE5 26. Nov 2017 14:20

AW: MD5-Prüfroutine für Delphi 10.2
 
Entweder mit den Jedis
Delphi-Quellcode:
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;
Oder mit Wolfgang Ehrhardt Hash-Units
Nur bei letzterer Möglichkeit weiß ich nicht, wie man die Prüfsumme einer Datei erstellt.

dummzeuch 26. Nov 2017 14:23

AW: MD5-Prüfroutine für Delphi 10.2
 
Zitat:

Zitat von LTE5 (Beitrag 1387187)
Entweder mit den Jedis

Delphi-Quellcode:
uses
 IdHashMessageDigest, IdHash;

Das ist aber indy, nicht Jedi.

@Harry: Wenn es schnell sein soll, ist aber CRC32 besser. Was ist der Zweck Deiner Prüfsumme?

LTE5 26. Nov 2017 14:24

AW: MD5-Prüfroutine für Delphi 10.2
 
Indy. Meine ich doch. Habe mich geirrt.

Zitat:

@Harry: Wenn es schnell sein soll, ist aber CRC32 besser.
CRC32 können Wolfgang Ehrhardt Hash-Units auch.
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.

Harry Stahl 26. Nov 2017 14:50

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.

LTE5 26. Nov 2017 14:52

AW: MD5-Prüfroutine für Delphi 10.2
 
Zitat:

da hat es 4 Minuten gedauert, bis das (richtige) Ergebnis kam.
Ich habe keine Ahnung, ob das schnell ist oder nicht wenn man bedenkt 5,3 GB und im Netzwerk.

CRC32 ist für dein Vorhaben eher ungeeignet soweit ich weiß.

When is CRC more appropriate to use than MD5/SHA1?

Harry Stahl 26. Nov 2017 15:11

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!

LTE5 26. Nov 2017 15:33

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;

MyRealName 26. Nov 2017 17:12

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;

LTE5 26. Nov 2017 18:34

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 09:40 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz