Exportar (0) Imprimir
Expandir todo
Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original

Object.GetHashCode (Método)

Actúa como función hash para un tipo concreto.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)

public virtual int GetHashCode()

Valor devuelto

Tipo: System.Int32
Código hash para la clase Object actual.

Un código hash es un valor numérico que se utiliza para identificar un objeto durante las pruebas de la igualdad. También puede actuar como un índice para un objeto en una colección.

El método GetHashCode es apto para el uso en algoritmos hash y estructuras de datos, como una tabla hash.

La implementación predeterminada del método GetHashCode no garantiza valores devueltos únicos para objetos diferentes. Además, .NET Framework no garantiza la implementación predeterminada del método GetHashCode, y el valor que devuelve será el mismo entre versiones diferentes de .NET Framework. Por consiguiente, la implementación predeterminada de este método no se debe utilizar como identificador de objetos único a efectos de aplicación de algoritmos hash.

El método GetHashCode puede ser reemplazado por un tipo derivado. Los tipos de valor deben reemplazar este método para proporcionar una función hash que sea apropiada para ese tipo y una distribución útil de una tabla hash. Para que los resultados sean únicos, el código hash se debe basar en el valor de una propiedad o campo de instancia, en lugar de en una propiedad o campo estático.

Los objetos utilizados como una clave en un objeto Hashtable también deben reemplazar el método GetHashCode porque esos objetos deben generar su propio código hash. Si un objeto utilizado como una clave no proporciona una implementación útil de GetHashCode, puede especificar un proveedor de código hash al construir el objeto Hashtable. Antes de la versión 2.0 de .NET Framework, el proveedor de código se basaba en la interfaz System.Collections.IHashCodeProvider. A partir de la versión 2.0, el proveedor de código hash se basa en la interfaz System.Collections.IEqualityComparer.

Notas para los implementadores

Una función hash se utiliza para generar con rapidez un número (código hash) que se corresponda con el valor de un objeto. Las funciones hash suelen ser específicas para cada Type y, para ser únicas, deben utilizar al menos uno de los campos de instancia como entrada.

Una función hash debe tener las siguientes propiedades:

  • Si dos objetos resultan iguales al compararlos, el método GetHashCode para cada objeto debe devolver el mismo valor. Sin embargo, si dos objetos no resultan iguales al compararlos, los métodos GetHashCode para los dos objetos no tienen que devolver valores diferentes.

  • El método GetHashCode para un objeto debe devolver de forma consecuente el mismo código hash mientras no haya ninguna modificación en el estado del objeto que determine el valor devuelto del método Equals del objeto. Observe que esto sólo es cierto para la ejecución actual de una aplicación, y que se puede devolver un código hash diferente si la aplicación se ejecuta de nuevo.

  • Para mejorar el rendimiento, la función hash debe generar una distribución aleatoria para todas las entradas.

Por ejemplo, la implementación del método GetHashCode proporcionada por la clase String devuelve códigos hash idénticos para valores de cadena idénticos. Por ello, dos objetos String devuelven el mismo código hash si representan el mismo valor de cadena. Asimismo, el método utiliza todos los caracteres de la cadena para generar una salida con una distribución aleatoria razonable, incluso en el caso de que la entrada esté agrupada en ciertos intervalos (por ejemplo, es posible que varios usuarios tengan cadenas que contengan únicamente los 128 caracteres ASCII inferiores, aunque una cadena puede contener cualquiera de los 65.535 caracteres Unicode).

En el caso de clases derivadas de Object, el método GetHashCode puede delegar en la implementación de Object.GetHashCode única y exclusivamente si dicha clase derivada define la igualdad de valores como igualdad de referencias y el tipo no es un tipo de valor.

El hecho de proporcionar una función hash adecuada a una clase puede influir de forma significativa en el rendimiento a la hora de agregar dichos objetos a una tabla hash. En una tabla hash con una implementación adecuada de una función hash, el tiempo necesario para buscar un elemento es constante (por ejemplo, una operación O(1)). En una tabla hash con una implementación inadecuada de una función hash, el rendimiento de una búsqueda depende del número de elementos de la tabla hash (por ejemplo, una operación O(n), donde n es el número de elementos de la tabla hash). El cálculo de funciones hash no debe llevar mucho tiempo.

Las implementaciones del método GetHashCode no deben dar lugar a referencias circulares. Por ejemplo, si ClassA.GetHashCode llama a ClassB.GetHashCode, ClassB.GetHashCode no debe llamar a ClassA.GetHashCode ni directa ni indirectamente.

Las implementaciones del método GetHashCode no deben producir excepciones.

Las clases derivadas que reemplazan el método GetHashCode también deben reemplazar el método Equals para garantizar que dos objetos considerados iguales tengan el mismo código hash; en caso contrario, puede que el tipo Hashtable no funcione correctamente.

En algunos casos, el método GetHashCode se implementa para devolver simplemente un valor entero. En el ejemplo de código siguiente se muestra una implementación de GetHashCode que devuelve un valor entero.

Hay otras maneras más complicadas de combinar códigos hash que pueden ofrecer mejor rendimiento para las tablas hash.


using System;

public struct Int32 {
   public int value;

   //other methods...

   public override int GetHashCode() {
      return value;
   }
}


En ocasiones, un tipo está formado por varios campos de datos que pueden participar en la generación del código hash. Una forma de generar un código hash es combinar estos campos utilizando una operación XOR (eXclusive OR), como se muestra en el siguiente ejemplo de código.


using System;

public struct Point {
   public int x;
   public int y; 

   //other methods

   public override int GetHashCode() {
      return x ^ y;
   }
}


En el siguiente ejemplo de código se muestra otro caso en el que los campos del tipo se combinan utilizando XOR (eXclusive OR) para generar el código hash. Conviene señalar que en este ejemplo de código, los campos representan tipos definidos por el usuario, cada uno de ellos implementa GetHashCode y Equals.


using System;

public class SomeType {
   public override int GetHashCode() {
     return 0;
   }
}

public class AnotherType {
   public override int GetHashCode() {
     return 1;
   }
}

public class LastType {
   public override int GetHashCode() {
     return 2;
   }
}

public class MyClass {
   SomeType a = new SomeType();
   AnotherType b = new AnotherType();
   LastType c = new LastType();

   public override int GetHashCode () {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}


Si el miembro de datos de la clase derivada es mayor que Int32, se pueden combinar los bits de orden superior del valor con los bits de orden inferior utilizando una operación XOR (eXclusive OR), tal y como se muestra en el siguiente ejemplo de código.


using System;

public struct Int64 {
   public long value;

   //other methods...

   public override int GetHashCode() {
      return ((int)value ^ (int)(value >> 32));
   }
}


.NET Framework

Compatible con: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Compatible con:

Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft