Eventuell so?
Die höherbittigen Additionen müssen ja nicht mehr ausgeführt werden, wenn sie nicht nötig sind.
Bin noch etwas müde, aber ich glaube, man kann die beiden IFs auch noch kombinieren, falls nötig.
(also nicht nur über ein billiges OR diese 1-zu-1 zusammenzuhängen)
Delphi-Quellcode:
{$IFDEF PUREPASCAL}
function AddV(var Value: LongWord; const Add: LongWord): Boolean; inline;
var
Temp: LongWord;
begin
Temp := Value;
Value := Value + Add;
Result := Value < Temp;
end;
function AddC(var Value: LongWord): Boolean; inline;
begin
Inc(Value);
Result := Value = 0;
end;
var
Data: TData absolute Value;
begin
if AddV(Data[0], Add shl 3) and AddC(Data[1]) and AddC(Data[2]) and AddC(Data[3])
and AddC(Data[4]) and AddC(Data[5]) and AddC(Data[6]) and AddC(Data[7]) then
HashingOverflowError;
if AddV(Data[1], Add shr 29) and AddC(Data[2]) and AddC(Data[3])
and AddC(Data[4]) and AddC(Data[5]) and AddC(Data[6]) and AddC(Data[7]) then
HashingOverflowError;
end;
{$ELSE !PUREPASCAL}
Natürlich ohne vollständige Auswertung der booleanische Ausdrücke und ohne Überlaufprüfung.
[add]
Delphi-Quellcode:
if ((AddV(Data[0], Add shl 3) and AddC(Data[1])) or AddV(Data[1], Add shr 29)) and AddC(Data[2])
and AddC(Data[3]) and AddC(Data[4]) and AddC(Data[5]) and AddC(Data[6]) and AddC(Data[7]) then
HashingOverflowError;
Hoffentlich isses richtig.
Aber für 64 Bit würde ich das auch noch auf 64 Bit umstellen und es so weiter zu verkürzen.
Delphi-Quellcode:
{$IFDEF PUREPASCAL}
function AddV(var Value: UInt64; const Add: UInt64): Boolean; inline;
var
Temp: UInt64;
begin
Temp := Value;
Value := Value + Add;
Result := Value < Temp;
end;
function AddC(var Value: UInt64): Boolean; inline;
begin
Inc(Value);
Result := Value = 0;
end;
var
Data: TData64 absolute Value; // array[0..3] of UInt64;
begin
if AddV(Data[0], UInt64(Add) shl 3) and AddC(Data[1]) and AddC(Data[2]) and AddC(Data[3]) then
HashingOverflowError;
end;
//////////////////////////////////////
{$IFDEF PUREPASCAL}
function AddC(var Value: UInt64): Boolean; inline;
begin
Inc(Value);
Result := Value = 0;
end;
var
Data: TData64 absolute Value; // array[0..3] of UInt64;
Temp: UInt64;
begin
Temp := Value;
Inc(Data[0], UInt64(Add) shl 3);
if (Value < Temp) and AddC(Data[1]) and AddC(Data[2]) and AddC(Data[3]) then
HashingOverflowError;
end;