2010-05-22 8 views

Respuesta

34

El requisito mínimo es que el código hash sea el mismo para cualquier valor dado. Por lo tanto, esta aplicación funciona, pero la distribución es horrible:

public override int GetHashCode() { 
    return 1; 
} 

Para trabajar mejor, los códigos hash debe tener en cuenta todos los datos pertinentes en el objeto y ser distribuida tan uniformemente como sea posible dentro del rango de números enteros.

En la estructura System.Drawing.Point se puede encontrar una implementación que considera todos los miembros, pero no ofrece una distribución muy buena. Utiliza XOR para combinar los bits de los miembros, lo que significa que todos los puntos en los que X e Y son iguales obtener el código hash de cero:

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

Una forma de obtener una mejor distribución es multiplicar un miembro por un primer número y añadir el siguiente miembro, repitiendo según sea necesario:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

el mismo método se ha utilizado en generadores aleatorios sencillos, ya que dispersa los valores bastante bien.

+0

Algunos puntos realmente buenos allí. ¡Gracias! – dotnetdev

Cuestiones relacionadas