我正在为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是关于安全性的,我不需要它。
答案 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)
这是一篇关于哈希速度的有趣文章:
答案 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)
答案 6 :(得分:0)
如果您事先知道您的点值介于0和N之间,则可以使用hashcode = X+Y*N;
这是一个相当明显的可能哈希值。它根本不是随意的,有重复的丑陋,而且通常很傻。它相当于连接两点的位,假设N是2的幂。它具有完美的均匀分布且没有碰撞。
我过去曾经使用过这种策略,但是承认它有一些真实(但很明显)的限制。最大的一个是当N足够大以至于N ^ 2不适合你的哈希值时发生的事情(即痛苦的碰撞。