Skip to content

Commit 15d1c17

Browse files
sglienkevincentparrett
authored andcommitted
improved hashtable performance for AnsiString
1 parent 171f7b4 commit 15d1c17

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

Source/Base/Spring.Comparers.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1293,7 +1293,7 @@ function Compare_LString(const inst: Pointer; const left, right: RawByteString):
12931293

12941294
function Equals_LString(const inst: Pointer; const left, right: RawByteString): Boolean;
12951295
begin
1296-
Result := Compare_LString(inst, left, right) = 0;
1296+
Result := left = right;
12971297
end;
12981298

12991299
function GetHashCode_LString(const inst: Pointer; const value: RawByteString): Integer;

Source/Base/Spring.HashTable.pas

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,14 @@ function THashTable<T>.FindWithoutComparer(const key: T; options: Byte): Pointer
640640
4: hashCode := PInteger(@key)^ and not RemovedFlag;
641641
8: hashCode := Integer(PInt64Rec(@key).Cardinals[0] xor PInt64Rec(@key).Cardinals[1]) and not RemovedFlag;
642642
end;
643+
tkLString:
644+
begin
645+
hashCode := 0;
646+
if PPointer(@key)^ <> nil then
647+
{$R-}
648+
hashCode := DefaultHashFunction(PPointer(@key)^^, PCardinal(PByte((@key)^) - 4)^) and not RemovedFlag;
649+
{$IFDEF RANGECHECKS_ON}{$R+}{$ENDIF}
650+
end;
643651
tkUString:
644652
begin
645653
hashCode := 0;
@@ -707,6 +715,8 @@ function THashTable<T>.FindWithoutComparer(const key: T; options: Byte): Pointer
707715
8: if TItem<Int64>(item^).Key <> PInt64(@key)^ then Continue;
708716
{$ENDIF}
709717
end;
718+
tkLString:
719+
if PAnsiString(@key)^ <> TItem<AnsiString>(item^).Key then Continue;
710720
tkUString:
711721
if PString(@key)^ <> TItem<string>(item^).Key then Continue;
712722
tkRecord:

0 commit comments

Comments
 (0)