Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#99

AW: DEC 5.2 String hashen?

  Alt 5. Mai 2017, 20:38
Hallo a.def

das hilft eventuell.

MD5 und SHA1 Hash Algorithmen sind absichtlich so konstruiert, dass du nicht von Anfang an das ganze Argument (= alle Filedaten) benötigst.
D.h. du kannst das File nach und nach lesen und jederzeit mit Update den Hash Wert der bereits gelesenen Filedaten berechnen. Du hast also nach jedem Schritt zwei Argumente um fortzufahren mit deiner Berechnung, den momentanen Hash Wert und die noch zu lesenden Filedaten.
Wenn du jeweils nur 128KB Filedaten liest, dann benötigst du an Daten nur diese 128KB im Arbeitsspeicher und ein paar Bytes für den Hash Wert.



Hier ein Beispiel mit MD5 (mit SHA1 läuft's genau "gleich"):

Mit

procedure SchreibeMD5HashAnsEndeDesFiles( const filename : string );

schreibst du die HashBytes ans Ende des Files:

Delphi-Quellcode:
procedure HashAnsEndeDesFilesSchreiben( filename : string; hash : TBytes );
var f : TFileStream;
begin
  f := TFileStream.Create( filename, fmOpenWrite );
 try
  f.Position := f.Size;
  f.Write( hash[0], length( hash ) );
 finally
  f.Free;
 end;
end;


procedure SchreibeMD5HashAnsEndeDesFiles( const filename : string );
var hash, hash2 : TBytes;
begin
  hash := System.hash.THashMD5.GetHashBytesFromFile( filename ); // Die in Delphi System.Hash definierte Funktion
  // hash2 := GetMD5HashFromFile( filename , [] ); // Du könntest auch "unsere" verwenden
  HashAnsEndeDesFilesSchreiben( filename, hash );
end;

Mit

function PruefeMD5HashAmEndeDesFiles( const filename : string ) : boolean;

kannst du überprüfen, ob die HashBytes am Ende des Files OK sind.

Delphi-Quellcode:
function LiesHashAmEndeDesFiles( const filename : string; len : integer ) : TBytes;
var f : TFileStream;
begin
  f := TFileStream.Create( filename, fmOpenRead );
 try
  f.Position := f.Size - len ;
  SetLength( Result, len );
  f.Read( Result, len );
 finally
  f.Free;
 end;
end;


function PruefeMD5HashAmEndeDesFiles( const filename : string ) : boolean;
var hashAmFileEnde, hash : TBytes;
begin
  hash := GetMD5HashFromFile( filename, [0,-17] ); // Wir lesen bis size-17, Den Hash Wert size-16..size-1 verarbeiten wir nicht
  hashAmFileEnde := LiesHashAmEndeDesFiles( filename, 16 ); // Wir lesen den Hash Wert am Ende des Files
  Result := CompareMem( hash, hashAmFileEnde, 16 ); // Wir vergleichen den berechneten Wert mit jenem am Fileende
end;


Testroutine:
1. Zuerst werden die Hashbytes ans Ende des Files geschrieben.

2. Hier wird gezeigt, wie du den Hash Wert am Ende des Files überprüfen kannst:

Delphi-Quellcode:
procedure pruefen;
var filename : string;
    allesok : boolean;
begin
  filename := 'C:\Users\Michael\Desktop\1GB.txt';

  // Ans Fileende schreiben:
  SchreibeMD5HashAnsEndeDesFiles( filename ); // 1.
  // Prüfen, ob der HashWert OK ist:
  allesok := PruefeMD5HashAmEndeDesFiles( filename ); // 2.

  ShowMessage( 'Check File : ' + allesok.ToInteger.ToString );
end;
Michael Gasser

Geändert von Michael II ( 5. Mai 2017 um 21:46 Uhr)