AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MD5-Prüfroutine für Delphi 10.2

Ein Thema von Harry Stahl · begonnen am 26. Nov 2017 · letzter Beitrag vom 29. Nov 2017
Antwort Antwort
Seite 2 von 4     12 34      
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#11

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

  Alt 26. Nov 2017, 18:57
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 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}
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#12

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

  Alt 26. Nov 2017, 18:59
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;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#13

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

  Alt 26. Nov 2017, 19:35
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

Geändert von gammatester (26. Nov 2017 um 19:38 Uhr)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

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

  Alt 26. Nov 2017, 20:07
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.
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#15

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

  Alt 26. Nov 2017, 23:04
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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#16

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

  Alt 27. Nov 2017, 08:41
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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#17

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

  Alt 27. Nov 2017, 08:42
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 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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

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

  Alt 27. Nov 2017, 09:09
Nur als Anmerkung nebenbei:
Überleg dir vllt. ob du einen anderen Hash benutzt als MD5.
MD5 ist veraltet und geknackt.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#19

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

  Alt 27. Nov 2017, 09:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

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

  Alt 27. Nov 2017, 09:42
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.
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