AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

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
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.546 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 26. Nov 2017, 16:11
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!
  Mit Zitat antworten Zitat
LTE5

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

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

  Alt 26. Nov 2017, 16:33
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;
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

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

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

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

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

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

  Alt 26. Nov 2017, 19:34
Um das zu kompletieren. Gibt es jemanden der eine funktionierende Implementierung (Datei / Stream hashen) mit den WE-Units fertig bekommt?
  Mit Zitat antworten Zitat
gammatester

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

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

  Alt 26. Nov 2017, 19: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
686 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

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

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

  Alt 26. Nov 2017, 20: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 20:38 Uhr)
  Mit Zitat antworten Zitat
LTE5

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

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

  Alt 26. Nov 2017, 21: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
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:33 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 by Thomas Breitkreuz