Search code examples
javahashhashmaphashcode

Good hashcode function for 2D coordinates


I would like to use a HashMap to map (x, y) coordinates to values. What is a good hashCode() function definition? In this case, I am only storing integer coordinates of the form (x, y) where y - x = 0, 1, ..., M - 1 for some parameter M.


Solution

  • To calculate a hash code for objects with several properties, often a generic solution is implemented. This implementation uses a constant factor to combine the properties, the value of the factor is a subject of discussions. It seems that a factor of 33 or 397 will often result in a good distribution of hash codes, so they are suited for dictionaries.

    This is a small example in C#, though it should be easily adabtable to Java:

    public override int GetHashCode()
    {
      unchecked // integer overflows are accepted here
      {
        int hashCode = 0;
        hashCode = (hashCode * 397) ^ this.Hue.GetHashCode();
        hashCode = (hashCode * 397) ^ this.Saturation.GetHashCode();
        hashCode = (hashCode * 397) ^ this.Luminance.GetHashCode();
        return hashCode;
      }
    }
    

    This scheme should also work for your coordinates, simply replace the properties with the X and Y value. Note that we should prevent integer overflow exceptions, in DotNet this can be achieved by using the unchecked block.