¿Cuál es un HashCode () efectivo para valores pequeños de x, grandes y?

Estoy mapeando valores x, y en un plano cartesiano con un HashMap. ¿Cuál sería un HashCode efectivo para valores x, muy grandes y muy pequeños?

Actualmente estoy usando:

 public int hashCode() {
    return ((y * 31) ^ x);

 // & Typical x,y values would be, (with many collisions on x):
  [4, 1000001] [9, 1000000] [5, 999996] [6, 999995] [4, 999997] 
  [6, 999997] [6, 1000003] [10, 999994] [8, 999997] [10, 999997] 
  [5, 999999] [4, 999998] [5, 1000003] [2, 1000005] [3, 1000004] 
  [6, 1000000] [3, 1000005]

Estoy insertando ambos pares x, y en la clave de un hashmap con un método .put, para evitar cualquier duplicado de pares x, y. Tampoco estoy seguro si esa es la solución más efectiva.

Respuestas a la pregunta(3)

Su respuesta a la pregunta