2009-03-19 14 views

Respuesta

8

La forma más visible es para las estructuras de mapeo.

Cualquier clase que lo haga tendrá un comportamiento impredecible cuando se utilice como clave para un diccionario o una tabla Hash. La razón es que la implementación usa GetHashCode y Equals para encontrar correctamente un valor en la tabla. La versión corta del algoritmo es el siguiente

  1. Tome el módulo de la HashCode por el número de cubos y que es el índice de cubo
  2. .equals call() para la clave especificada y cada clave en el depósito concreto .
  3. Si hay una coincidencia que es el valor, no coincide = sin valor.

El hecho de no mantener GetHashCode e Igual en sincronía romperá por completo este algoritmo (y muchos otros).

+0

gracias por aclarar eso. –

+0

¿Cómo determina la implementación cuántos cubos usar? ¿Es este un valor fijo? –

7

El blog de Jared Parsons tiene una buena explicación sobre la implementación de la igualdad y las razones por las que GetHashCode es tan importante.

Properly Implementing Equality

+6

¿Es vergonzoso votar un enlace a su propio blog? – JaredPar

0

Si no se sobreescribe GetHashCode, cualquier cosa que compara los objetos pueden hacerlo mal.

Como está documentado que GetHashCode debe devolver el mismo valor si dos instancias son iguales, entonces es prerrogativa de cualquier código que desee probar su igualdad para usar GetHashCode como primer paso para agrupar objetos que pueden ser iguales (ya que sabe que los objetos con diferentes códigos hash no pueden ser iguales). Si su método GetHashCode devuelve valores diferentes para objetos iguales, es posible que entren en diferentes grupos en la primera pasada y nunca se comparen utilizando su método Equals.

Esto podría afectar a cualquier estructura de datos de tipo colección, pero sería particularmente problemático en los basados ​​en código hash como diccionarios y conjuntos de hash.

En resumen: siempre anule GetHashCode cuando invalide Equals, y asegúrese de que sus implementaciones sean consistentes.

0

Cualquier algoritmo que utilice la clave no funcionará, suponiendo que se basa en el comportamiento previsto de las teclas hash.

Dos objetos que son Equal deben tener el mismo valor de clave hash, que no está garantizado de forma remota por la implementación predeterminada.

1

Piense en una estructura hash/diccionario como una colección de segmentos numerados. Si siempre coloca cosas en el depósito correspondiente a su GetHashCode(), entonces solo tiene que buscar un depósito (usando Equals()) para ver si hay algo allí. Esto funciona, siempre que estés buscando en el cubo correcto.

Así que la regla es: si Equals() dice que dos objetos son iguales(), deben tener tienen el mismo GetHashCode().

+0

En lugar de pensar en términos de categorías numeradas, creo que es más fácil decir que los códigos hash se usan para evitar comparaciones. Si el código hash del objeto X es conocido, por cualquier medio, para no coincidir con el código hash del objeto Y, no hay necesidad de comparar nada más sobre ellos. Los intervalos proporcionan una manera fácil para que el código ignore los elementos cuyos códigos hash no pueden igualar algún valor particular, pero muchas colecciones comparan explícitamente los códigos hash incluso de los elementos que se clasifican en el mismo segmento. – supercat

Cuestiones relacionadas