Как я могу создать хэш-код для пользовательской структуры данных?

Я создал специальную структуру данных «Координаты», которая определяет положение объекта в соответствии с определенной системой.

Координата определяется следующим образом:

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. Но когда я пытаюсь скомпилировать код этим методом, я почти уверен, что он сталкивается с коллизиями, так как сборка никогда не завершается. Вероятно, попадание во всевозможные беспорядочные циклы, думая, что связка координат одинакова или что-то вроде того.

Прошу прощения, это элементарный вопрос, но я почему-то в тупике. Я просто ищу совета, как написать этот хеш-код, чтобы он не конфликтовал.

6
задан Ernest Friedman-Hill 28 October 2011 в 03:43
поделиться