最快的哈希码生成器.NET

时间:2009-06-08 13:00:12

标签: c# .net hash

我正在为C#中的System.Drawing.Point类实现一个自定义GetHashCode。我的方法目前未达到以下要求:

var hashA = MyGetHashCode(new Point(1, 0));
var hashB = MyGetHashCode(new Point(0, 1));
var hashC = MyGetHashCode(new Point(0, 0));
var hashD = MyGetHashCode(new Point(1, 1));
Assert.AreNotEqual(hashA ^ hashB, hashC ^ hashD);

要通过此测试,我确信使用新的SHA256Managed()。ComputeHash(currentHash)可以。但是还有其他更快的哈希算法吗?我知道SHA256是关于安全性的,我不需要它。

7 个答案:

答案 0 :(得分:6)

一个简单的哈希?怎么样的:

 (17 * point.X) + (23 * point.Y);

或者更明显的熵:

int hash = -1047578147;
hash = (hash * -1521134295) + point.X;
hash = (hash * -1521134295) + point.Y;

(来自C#的匿名类型代码的数字)

答案 1 :(得分:3)

  • 你为什么要这样做?当然System.Drawing.Point已经具有良好的散列函数了吗?

  • 您了解测试并不代表严格要求,对吗?哈希码不必是唯一的。

  • 如果你真的想要一个非常好的相关坐标哈希,你可能想从this page开始关于哈希多个整数。

答案 2 :(得分:1)

我知道这不会回答你的问题,但为了其他读者的缘故,我必须提到你正在改变框架的内置方法的默认行为。根据文件:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

  

默认执行   GetHashCode方法没有   保证唯一的返回值   不同的对象。而且,   .NET Framework不保证   默认执行   GetHashCode方法,以及它的值   回报将是相同的   不同版本的.NET   框架。因此,默认   这个方法的实现必须   不能用作唯一对象   用于哈希目的的标识符

答案 3 :(得分:1)

这是一篇关于哈希速度的有趣文章:

A Hash Function for Hash Table Lookup

答案 4 :(得分:1)

一个简单的Elf哈希实现(它在delphi中,应该很容易翻译)

function ElfHash(id : string; tableSize : integer) : integer;
var
  i : integer;
  h,x : longint;
begin
  h := 0;
  // Obtener el valor numérico
  for i := 1 to Length(id) do
  begin
    h := (h shl 4) + Ord(id[i]);

    x := h and $F0000000;
    if x <;>; 0 then
       h = h xor (x shr 24) xor x;
  end;
  // Ajustar al tamaño de la tabla
  result := h mod tableSize;
end;

答案 5 :(得分:0)

我不知道您的申请是什么,但您可能正在寻找Zobrist哈希。

http://en.wikipedia.org/wiki/Zobrist_hashing

它可以逐步更新,这使得它非常快。

答案 6 :(得分:0)

如果您事先知道您的点值介于0和N之间,则可以使用hashcode = X+Y*N;这是一个相当明显的可能哈希值。它根本不是随意的,有重复的丑陋,而且通常很傻。它相当于连接两点的位,假设N是2的幂。它具有完美的均匀分布且没有碰撞。

我过去曾经使用过这种策略,但是承认它有一些真实(但很明显)的限制。最大的一个是当N足够大以至于N ^ 2不适合你的哈希值时发生的事情(即痛苦的碰撞。