jpf*_*ius 1 delphi hash delphi-2010
Bob Jenkins哈希函数是否存在不区分大小写的变体?
Generics.Defaults.BobJenkinsHash
Run Code Online (Sandbox Code Playgroud)
提供快速哈希函数.不幸的是,它不能与不区分大小写的比较函数结合使用
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;
Run Code Online (Sandbox Code Playgroud)
这是因为TDictionary首先比较哈希码,然后在检查相等性时使用提供的比较器.
当然我可以在我的GetHashCode函数中使用UpperCase ,但我想知道如果我能以某种方式修改哈希函数本身会更快.
它会稍微快一点,但会严重损害你的可维护性。这种类型的微观优化很少有充分的理由。只需在按照您的建议进行散列之前将字符串转换为小写或大写即可。
“我们应该忘记小效率,大约 97% 的时候:过早的优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。一个好的程序员不会因为这样的事情而自满。推理时,他会明智地仔细查看关键代码;但前提是该代码已被识别”——Donald Knuth