是否存在Bob Jenkins散列函數的不區分大小寫的變體?不區分大小寫的Bob Jenkins哈希?
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首先比較哈希碼,然後檢查平等時使用所提供的比較器。
當然,我可以在我的GetHashCode
函數中使用UpperCase,但我想知道如果我能以某種方式修改散列函數本身,速度會更快。
對於Delphi 2010,使用「CompareText()」和「UpperCase()」是錯誤的 - 這些函數對Unicode字符串不起作用。請參閱https://forums.embarcadero。COM/thread.jspa?線程ID = 26949&TSTART = 0。 – mghie
對於AnsiStrings,CompareText()和UpperCase()也是錯誤的,因爲它們只能對ASCII字符串進行操作。 –