title: How can I make a hashcode for a custom data structure?
body: <p>I've made a custom "Coordinate" data structure which defines the position of an object according to a certain system.</p>
  
  <p>A coordinate is defined as follows:</p>
  
  <pre><code>public class Coordinate
  {
      public int X;
      public int Y;
      private int face;
      public int Face
      {
          get { return face; }
          set
          {
              if (value &gt;= 6 | value &lt; 0)
                  throw new Exception("Invalid face number");
              else
                  face = value;
          }
      }
      private int shell;
      public int Shell
      {
          get { return shell; }
          set
          {
              if (value &lt; 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 &amp;&amp; Shell == other.Shell &amp;&amp; X == other.X &amp;&amp; Y == other.Y);
      }
  }
  </code></pre>
  
  <p>Or, to summarize, it contains an int Face (0 to 5), an int X, int Y, and int Shell.  X, Y, and Shell are all bound below at 0 (inclusive).</p>
  
  <p>I have no experience at all in hash codes.  I need to compare them to see if they are equal.  I tried this:</p>
  
  <pre><code>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;
  </code></pre>
  
  <p>Going off something I found while Googling.  But when I try to compile the code with this method, I'm pretty sure it runs into collisions, as it never finishes building.  Probably getting into all sorts of messy loops thinking a bunch of the coordinates are the same or somesuch.</p>
  
  <p>I'm sorry this question is rather elementary, but for some reason I'm stumped.  I'm just looking for advice on how to write this hash code so that it doesn't collide.</p>