私は、特定のシステムに従ってオブジェクトの位置を定義するカスタムの「座標」データ構造を作成しました。
座標は次のように定義されます。
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;
Google検索で見つけたものを外に出す。しかし、このメソッドを使ってコードをコンパイルしようとすると、ビルドが完了しないので、衝突に陥ることはありません。おそらく座標の束を考えていろいろな種類の不器用なループに遭うかもしれません。
申し訳ありませんが、この質問はかなり基本的ですが、何らかの理由で私は困惑しています。私はちょうどそれが衝突しないようにこのハッシュコードを書く方法のアドバイスを探しています。