Существует ли нечувствительный к регистру вариант хеш-функции Боба Дженкинса?
Generics.Defaults.BobJenkinsHash
обеспечивает быструю функцию хеширования. К сожалению, его нельзя использовать в сочетании с функцией сравнения без учета регистра, например
TCustomStringComparer = class (TEqualityComparer <String>)
function Equals(const Left, Right: String): Boolean; override;
function GetHashCode(const Value: String): Integer; override;
end;
function TCustomStringComparer.Equals (const Left, Right : String) : Boolean;
begin
Result := CompareText (Left, Right) = 0;
end;
function TCustomStringComparer.GetHashCode (const Value : String) : Integer;
begin
Result := Generics.Defaults.BobJenkinsHash (Value [1], Length (Value) * SizeOf (Char), 0);
end;
Это потому, что TDictionary сначала сравнивает хеш-коды, а затем использует предоставленный компаратор при проверке на равенство.
Конечно, я мог бы использовать UpperCase в моей GetHashCode
функции, но я подумал, будет ли быстрее, если я смогу каким-то образом изменить саму хэш-функцию.