不区分大小写的Bob Jenkins哈希?

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 ,但我想知道如果我能以某种方式修改哈希函数本身会更快.

Nie*_*tle 8

不,哈希函数没有大小写不变的版本.在将所有字符串传递给散列函数之前,将所有字符串置大小写.

  • 是的,我确认这是一个解决方案. (2认同)

Tho*_*rin 5

它会稍微快一点,但会严重损害你的可维护性。这种类型的微观优化很少有充分的理由。只需在按照您的建议进行散列之前将字符串转换为小写或大写即可。

“我们应该忘记小效率,大约 97% 的时候:过早的优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。一个好的程序员不会因为这样的事情而自满。推理时,他会明智地仔细查看关键代码;但前提是该代码已被识别”——Donald Knuth

  • +1 获取 Knuth 的完整报价。所以我们常常只得到“过早的优化是万恶之源”的部分。 (2认同)