Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

gammatester 26. Nov 2017 18:57

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

Zitat von LTE5 (Beitrag 1387199)
Um das zu kompletieren. Gibt es jemanden der eine funktionierende Implementierung (Datei / Stream hashen) mit den WE-Units fertig bekommt?

Ist schon eingebaut! Jede Hash-Unit exportiert eine Prozedur dafür, siehe http://www.wolfgang-ehrhardt.de/hash_intro.html (specific units).
Delphi-Quellcode:
procedure [Hash]File(fname: Str255; var Digest: T[Hash]Digest; var buf; bsize: word; var Err: word);
  {-[Hash] of file, buf: buffer with at least bsize bytes}
Also für MD5 die
Delphi-Quellcode:
procedure MD5File
. Allerdings ist in Unit Hash wg. 16-Bit-Kompatibilität nur ein max. 64-KB-Buffer implementiert:
Delphi-Quellcode:
procedure HashFile(const fname: Str255; PHash: PHashDesc;    
                  var Digest: THashDigest; var buf; bsize: word; var Err: word);
  {-Calculate hash digest of file, buf: buffer with at least bsize bytes}

MyRealName 26. Nov 2017 18:59

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

Zitat von LTE5 (Beitrag 1387199)
Um das zu kompletieren. Gibt es jemanden der eine funktionierende Implementierung (Datei / Stream hashen) mit den WE-Units fertig bekommt?

Also ohne diese WE units zu kennen, müsste es so gehen :

Code:
function MD5(const AFileName: String): string;
var
 Context: THashContext;
 Hash: TMD5Digest;
 aStream : TMemoryStream;
begin
 aStream := TTMemoryStream.Create;
 aStream.LoadFromFile(AFileName);
 MD5Init(Context);
 MD5Update(Context, aStream.Memory^, aStream.Size);
 MD5Final(Context, Hash);
 Result := string(Mem_Util.HexStr(@Hash, SizeOf(Hash)));
 aStream.Free;
end;

gammatester 26. Nov 2017 19:35

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

Zitat von MyRealName (Beitrag 1387201)
Zitat:

Zitat von LTE5 (Beitrag 1387199)
Um das zu kompletieren. Gibt es jemanden der eine funktionierende Implementierung (Datei / Stream hashen) mit den WE-Units fertig bekommt?

Also ohne diese WE units zu kennen, müsste es so gehen :

Nein, nicht ganz. Hier ein Konsol-Prgramm, das paramstr(1) hasht.
Delphi-Quellcode:
program md5file;
{$apptype console}

uses
  system.classes,
  hash, md5, mem_util;

function MD5F(const AFileName: String): string;
var
 Context: THashContext;
 Hash: TMD5Digest;
 aStream : TMemoryStream;
begin
 aStream := TMemoryStream.Create;
 aStream.LoadFromFile(AFileName);
 MD5Init(Context);
 MD5UpdateXL(Context, aStream.Memory, aStream.Size);
 MD5Final(Context, Hash);
 Result := string(Mem_Util.HexStr(@Hash, SizeOf(Hash)));
 aStream.Free;
end;

begin
  writeln(MD5F(paramstr(1)));
end.
Und das Ergebnis für ein File mit 512 MB nur 'a':
Code:
D:\Work\CRC_HASH>timethis md5file 512MB_A

TimeThis : Command Line : md5file 512MB_A
TimeThis :   Start Time : Sun Nov 26 20:32:01 2017

31e4d9c6d74cd592b78f77f72965d6ab

TimeThis : Command Line : md5file 512MB_A
TimeThis :   Start Time : Sun Nov 26 20:32:01 2017
TimeThis :     End Time : Sun Nov 26 20:32:04 2017
TimeThis : Elapsed Time : 00:00:02.840

LTE5 26. Nov 2017 20:07

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

TimeThis : Elapsed Time : 00:00:02.840
Zitat:

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.
Wenn mein mathematisches Unverständnis mich jetzt nicht täuscht, dann sollten Wolfgang Erhardts Units bei 5,3 GB an Daten circa 4 bis 5x schneller sein als die Indys die Harry Stahl zuvor unter Linux getestet hat.

mensch72 26. Nov 2017 23:04

AW: MD5-Prüfroutine für Delphi 10.2
 
Eine beliebige Datei (hier 5,3GB) komplett in MemoryStream einlesen ist doch Wahnsinn... morgen ist es eine 15GB Datei und da is auch in 64bit mit 16GB Ram schluss mit lustig...

- weil es sich schön rechnen lässt und "etwas" RAM heutzutage ja da ist, würde ich 2 Threads und 2x100MB Puffer nutzen...
- ein Thread liest je 100MB Puffer ein, das sollte bei heutigen HDD 0,5..1sec(=100..200MB/sec) dauern und ist per SSD noch schneller
- ein Thread rechnet den MD5 über den jeweils geladenen 100MB Puffer
- plus irgendwas einfaches als "Sync"

=> ich denke das wird die schnellste und noch einfach zu programmierende Variante ergeben, weil NextLoad&Calc auf heutigen mindestens DualCores echt parallel ablaufen
-> nebenbei trennt man so sauber Load&Calc, sodass man simpel diee jeweiligen Ausführungszeiten getrennt aufsummieren kann

TiGü 27. Nov 2017 08:41

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

Zitat von Harry Stahl (Beitrag 1387186)
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.

Der MD5, der mit Delphi dabei ist, ist dir zu langsam?
Der kann jedenfalls beliebig große Dateien, da er immer in Blöcken von 4096 Bytes in einer Schleife ausliest und den MD5 updated, bis zum Dateiende.

Delphi-Quellcode:
program Project3;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Hash;

procedure Main;
var
  MyFilename: string;
begin
  MyFilename := 'C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\system-images\android-23\android-tv\armeabi-v7a\system.img';
  Writeln(THashMD5.GetHashStringFromFile(MyFilename));
end;

begin
  try
    Main;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

gammatester 27. Nov 2017 08:42

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

Zitat von mensch72 (Beitrag 1387213)
Eine beliebige Datei (hier 5,3GB) komplett in MemoryStream einlesen ist doch Wahnsinn... morgen ist es eine 15GB Datei und da is auch in 64bit mit 16GB Ram schluss mit lustig...

Ganz meine Meinung :thumb: In einer virtuellen Maschine war bei mir auf schon bei 512 MB Schluß, mit nichtssagender Stream Error Exception. Deine Lösung mag zwar schneller sein, aber selbst mit der simplen eingebauten Prozedur MD5File aus md5.pas Lösung mit max. 64 KB Buffer hat man keine wesentlichen Geschwindingkeitseinbußen:
Code:
D:\Work\CRC_HASH>timethis md5fileb.exe 512MB_A

TimeThis : Command Line : md5fileb.exe 512MB_A
TimeThis :   Start Time : Mon Nov 27 09:33:02 2017

sizeof(buf)= 61440
31e4d9c6d74cd592b78f77f72965d6ab

TimeThis : Command Line : md5fileb.exe 512MB_A
TimeThis :   Start Time : Mon Nov 27 09:33:02 2017
TimeThis :     End Time : Mon Nov 27 09:33:05 2017
TimeThis : Elapsed Time : 00:00:02.474

Neutral General 27. Nov 2017 09:09

AW: MD5-Prüfroutine für Delphi 10.2
 
Nur als Anmerkung nebenbei:
Überleg dir vllt. ob du einen anderen Hash benutzt als MD5.
MD5 ist veraltet und geknackt.

TiGü 27. Nov 2017 09:34

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

Zitat von Neutral General (Beitrag 1387229)
Nur als Anmerkung nebenbei:
Überleg dir vllt. ob du einen anderen Hash benutzt als MD5.
MD5 ist veraltet und geknackt.

Bitte Beitrag Nummer 5 lesen.
Es geht hier nicht um Passwörter oder sowas!
Die Anbieter von großen Downloads bieten neben dem Download-Link auch den von ihnen berechneten Hash-Wert (siehe Emba-Link unten).
Nach dem Runterladen der Datei kann man über die runtergeladene Datei selber den Hash ziehen und mit dem originalen Hash vergleichen.
Wenn alles gut ist, dann ist die Datei korrekt runtergeladen.


Beispiel:
https://cc.embarcadero.com/item/30725

Neutral General 27. Nov 2017 09:42

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

Zitat von TiGü (Beitrag 1387232)
Es geht hier nicht um Passwörter oder sowas!
[...] Wenn alles gut ist, dann ist die Datei korrekt runtergeladen.

Schon klar.
Aber auch bei Dateien lässt sich das ganze ausnutzen und der Benutzer bekommt eine Datei mit gleichem Hash aber
anderem (bösartigem) Inhalt. Ich will ja jetzt nicht zwangsweise den Teufel an die Wand malen.
Ich will nur sagen, dass man nichts zu verlieren und nur gewinnen kann wenn man sich für ein sichereres Hashverfahren entscheidet.
Und bei den meisten Hash-Bibliotheken reicht es die Deklaration seines Hash-Objekts von TMD5Hash (o.ä.) auf TSHA3Hash (o.ä.) umzuändern und man ist auf der sicheren Seite.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 Uhr.
Seite 2 von 4     12 34      

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