Einzelnen Beitrag anzeigen

Michael II

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

AW: DEC 5.2 String hashen?

  Alt 5. Mai 2017, 15:46
Hallo a.def,

ich habe dir hier noch rasch die ähnliche Funktion für SHA1 geschrieben:

Delphi-Quellcode:
procedure AddSHA1HashBytes( var lHasher: THashSHA1; const AStream: TStream; von, bis : int64 );
const
   BufferSize = 64*1024;
var
  lStreamBytes: TBytes;
  Lies, SollLesen : int64;
  len : integer;
begin
  if bis >= AStream.size then bis := Astream.size-1;
  if von < 0 then von := 0;
  if bis >= von then
  begin
    setlength(lStreamBytes, BufferSize);
    AStream.Position := von;
    SollLesen := bis-von+1;
    while SollLesen > 0 do
    begin
      if SollLesen >= BufferSize then Lies := BufferSize else Lies := SollLesen;
      len := Astream.ReadData(lStreamBytes, Lies);
      if len = 0 then break;
      dec(SollLesen,len);
      lHasher.Update(lStreamBytes, len);
    end;
  end;
end;



function GetSHA1HashFromFile( aFileName : string; vonbis : array of int64 ) : TBytes;
var f : TFileStream;
   lSHA1: THashSHA1;
   i, len : integer;
   von, bis : int64;

begin
  f := TFileStream.Create( aFileName, fmOpenRead );
 try
  lSHA1 := THashSHA1.Create;
  lSHA1.Reset;
  len := length(vonbis);
  if len < 2 then
  begin
      AddSHA1HashBytes( lSHA1, f, 0, f.Size-1 );
  end
  else
  begin
      i := 0;
      while len-i >= 2 do
      begin
        von := vonbis[i];
        bis := vonbis[i+1];
        if von < 0 then von := f.Size+von;
        if bis < 0 then bis := f.Size+bis;

        AddSHA1HashBytes( lSHA1, f, von, bis);
        inc(i,2);
      end;
  end;
  Result := lSHA1.HashAsBytes;
 finally
  f.Free;
 end;
end;


Wenn du von Byte 0 bis 2000 und von Byte 2001 bis ans Ende hashen willst:

GetSHA1HashFromFile( filename, [0, 2000, 2001, maxint] );

Damit hashst du übers ganze File und erhältst natürlich exakt den gleichen Wert wie via
System.hash.THashSHA1.GetHashBytesFromFile( filename );

Beispiel 2:
Wenn du die 20 Bytes 192435 - 192454 nicht "mithashen" willst:
GetSHA1HashFromFile( filename, [0, 192434, 192455, maxint] );
Wenn du deinen SHA1 Hash Wert h ins Programm schreibst und h ab Position 192435 abgelegt ist, dann ist dies der Aufruf der Wahl .

Beispiel 3:
Ein positiver Wert n wird interpretiert als Fileposition n.
Ein negativer Wert n wird interpretiert als Fileposition fsize+n.

GetSHA1HashFromFile( filename, [0, -21] );

Wenn du zum Beispiel an dein File einen SHA1 Hash (20 Bytes) angehängt hast, dann hashst du in diesem Beispiel über dein File, nicht aber über den angehängten Hash Wert.

Beispiel 4:
Du kannst natürlich über beliebig viele Intervalle hashen, zum Beispiel über drei:
GetSHA1HashFromFile( filename, [0,255, 256+pesig, 256+pesig+peofs-1, -20,maxint] );
Michael Gasser

Geändert von Michael II ( 5. Mai 2017 um 18:57 Uhr)