Einen Hashwert für jeden Stream zu ermitteln macht wenig Sinn, da zum Ermitteln des Hashwertes sowieso
der gesamte Stream gelesen werden muss!!!
Es gibt wirklich nur eine einzige saubere Möglichkeit:
Beide Streams
blockweise in den Speicher lesen und jeweils beide Blöcke miteinander vergleichen.
Würde man den Stream komplett in einen String einlesen, würde bei grossen Streams der Hauptspeicher unnötig stark
beansprucht!
Deshalb:
Delphi-Quellcode:
{**************************************************************************
* NAME: CompareStreams
* DESC: Vergleicht den Inhalt 2er Streams
* PARAMS: 2 Streams
* RESULT: True => Inhalt gleich, False => Inhalt verschieden
*************************************************************************}
function CompareStreams(const A, B : TStream): Boolean;
const
BUFSIZE = 8196;
var
bufA, bufB : string;
r : Integer;
begin
if A.Size <> B.Size then
Result := False
else
begin
A.Position := 0;
B.Position := 0;
SetLength(bufA, BUFSIZE);
SetLength(bufB, BUFSIZE);
while A.Position < A.Size do
begin
r := A.Size - A.Position;
if r > BUFSIZE then
r := BUFSIZE;
A.ReadBuffer(bufA[1], r);
B.ReadBuffer(bufB[1], r);
if not CompareMem(PChar(bufA), PChar(bufB), r) then
begin
Result := False;
Exit;
end;
end;
Result := True;
end;
end;