![]() |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
![]()
Delphi-Quellcode:
Also für MD5 die
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}
Delphi-Quellcode:
. Allerdings ist in Unit Hash wg. 16-Bit-Kompatibilität nur ein max. 64-KB-Buffer implementiert:
procedure MD5File
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} |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
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; |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
Delphi-Quellcode:
Und das Ergebnis für ein File mit 512 MB nur 'a':
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.
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 |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
Zitat:
|
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 |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
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. |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
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 |
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. |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
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: ![]() |
AW: MD5-Prüfroutine für Delphi 10.2
Zitat:
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. |
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