我已经制作了一个自定义的“Coordinate”数据结构,它根据某个系统定义了一个对象的位置。
坐标定义如下:
public class Coordinate
{
public int X;
public int Y;
private int face;
public int Face
{
get { return face; }
set
{
if (value >= 6 | value < 0)
throw new Exception("Invalid face number");
else
face = value;
}
}
private int shell;
public int Shell
{
get { return shell; }
set
{
if (value < 0)
throw new Exception("No negative shell value allowed");
else
shell = value;
}
}
public Coordinate(int face, int x, int y, int shell)
{
this.X = x;
this.Y = y;
this.face = face;
this.shell = shell;
}
public static Coordinate operator +(Coordinate a, Coordinate b)
{
return new Coordinate(a.Face + b.Face, a.X + b.X, a.Y + b.Y, a.Shell + b.Shell);
}
public override bool Equals(object obj)
{
Coordinate other = (obj as Coordinate);
if (other == null)
return false;
else
return (Face == other.Face && Shell == other.Shell && X == other.X && Y == other.Y);
}
}
或者,总而言之,它包含一个int Face(0到5),一个int X,int Y和int Shell。 X,Y和Shell都在0(含)以下绑定。
我根本没有哈希码的经验。我需要比较它们,看它们是否相等。我试过这个:
private const int MULTIPLIER = 89;
[...]
int hashCode = 1;
hashCode = MULTIPLIER * hashCode + obj.X.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Y.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Face.GetHashCode();
hashCode = MULTIPLIER * hashCode + obj.Shell.GetHashCode();
return hashCode;
关掉谷歌搜索时找到的东西。但是当我尝试用这种方法编译代码时,我很确定它会遇到冲突,因为它永远不会完成构建。可能会遇到各种各样的混乱循环,认为一堆坐标是相同的或类似的。
对不起,这个问题相当简单,但出于某种原因,我很难过。我只是在寻找有关如何编写此哈希码的建议,以便它不会发生冲突。
答案 0 :(得分:12)
如果这不是最好的方法,那么这可能是一个很好的方法:
public override int GetHashCode()
{
return string.Format("{0}-{1}-{2}-{3}", X, Y, Face, Shell).GetHashCode();
}
<强>更新强> 看一下这篇文章:http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/
答案 1 :(得分:2)
基本上,在编写哈希码函数时,您需要确保:
此外,如果:
,这很好,但不是必需的你不需要确保不同的对象返回不同的哈希码。它只是不受欢迎,因为它可以降低像Hashtables这样的东西的性能(如果你有很多碰撞)。
但是,如果您仍希望哈希码函数返回唯一值,那么您想了解perfect hashing。
答案 2 :(得分:0)
如果您使用dotnetcore 2.1+,则可以使用HashCode struct的Combile
方法,它非常容易使用和高效。