Exportar (0) Imprimir
Expandir todo

Object.GetHashCode (Método)

Sirve como función hash para un tipo concreto. GetHashCode es apropiado para su utilización en algoritmos de hash y en estructuras de datos como las tablas hash.

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

public virtual int GetHashCode ()
public int GetHashCode ()
public function GetHashCode () : int

Valor devuelto

Código hash para la clase Object actual.

Este método puede ser reemplazado por una clase derivada. Las clases de valor deben reemplazar este método para proporcionar una función hash que sea apropiada para la clase y que garantice una mejor distribución de la tabla hash. Las clases que pudieran utilizarse como clave en una tabla hash también deben reemplazar este método, porque los objetos que se utilizan como claves en una tabla hash tienen que generar su propio código hash mediante este método. No obstante, si los objetos que se utilizan como claves no ofrecen una implementación útil de GetHashCode, se puede utilizar otro proveedor de código hash basado en la interfaz System.Collections.IHashCodeProvider cuando se construye Hashtable.

La implementación predeterminada de GetHashCode no garantiza exclusividad o coherencia; por lo tanto, no debe utilizarse como identificador de objetos único para propósitos relacionados con la aplicación de algoritmos hash. Las clases derivadas deben reemplazar GetHashCode por una implementación que devuelva un código hash único. Para obtener unos mejores resultados, el código hash debe basarse en el valor de una propiedad o campo de una instancia, en lugar de basarse en una propiedad o campo estático.

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 deben utilizar al menos uno de los campos de instancia como entrada. Una función hash debe tener las siguientes propiedades:

  • Si dos objetos del mismo tipo representan el mismo valor, la función hash debe devolver el mismo valor constante para cualquiera de los dos objetos.

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

  • Asimismo, debe devolver exactamente el mismo valor con independencia de los cambios que se efectúen en el objeto.

Por ejemplo, la implementación de GetHashCode que la clase String proporciona devuelve códigos hash únicos para valores de cadena únicos. 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). GetHashCode debe devolver siempre el mismo valor para una instancia dada del objeto. En el caso de las clases derivadas de Object, GetHashCode puede delegar en la implementación de Object.GetHashCode única y exclusivamente si dicha clase define la igualdad de valores como igualdad referencial 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 de 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 de 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 Hashtable no funcione correctamente.

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

using System;

public struct Int32 {
   public int value;

   //other methods...

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

import System.*;
public class Int32
{
	public int value;

	//other methods...
	public int GetHashCode()
	{
		return value;
	} //GetHashCode
} //Int32

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));
   }
}

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 2.0, 1.0

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft