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] );