He creado una estructura de datos "Coordinar" personalizada que define la posición de un objeto según un sistema determinado.¿Cómo puedo hacer un código hash para una estructura de datos personalizada?
una coordenada se define como sigue:
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);
}
}
O, para resumir, que contiene una cara int (0 a 5), un int X, int Y, e INT Shell. X, Y y Shell están todos vinculados a continuación en 0 (inclusive).
No tengo ninguna experiencia en absoluto en los códigos hash. Necesito compararlos para ver si son iguales. Intenté esto:
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;
Saliendo algo que encontré mientras buscaba en Google. Pero cuando intento compilar el código con este método, estoy bastante seguro de que se encuentra con colisiones, ya que nunca termina de construirse. Probablemente metiéndose en todo tipo de bucles desordenados, pensando que un montón de coordenadas son las mismas o algo así.
Lamento que esta pregunta sea bastante elemental, pero por alguna razón estoy perplejo. Solo estoy buscando consejos sobre cómo escribir este código hash para que no colisione.
No hay ningún problema si los códigos hash colisionan. Es preferible no tener colisiones, pero no es necesario (y matemáticamente tampoco es posible). – Jon
http://msdn.microsoft.com/en-us/library/system.object.gethashcode%28v=vs.71%29.aspx - "Las clases derivadas deben anular GetHashCode con una implementación que devuelve un código hash único. " –
@MattFenwick Debido al principio del casillero, no existe un código hash único para la mayoría de los tipos.* Ese artículo es un poco inexacto. Quitaron esa línea en las siguientes versiones. * - 'int.GetHashCode()' es probablemente único para cada número. –