Object.GetHashCode Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Sirve como la función hash predeterminada.
public:
virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Devoluciones
Código hash para el objeto actual.
Comentarios
Para obtener más información sobre esta API, consulte Comentarios complementarios de api para Object.GetHashCode.
Notas a los desarrolladores de herederos
Una función hash se usa para generar rápidamente un número (código hash) que corresponde al valor de un objeto . Las funciones hash suelen ser específicas de cada tipo y, para la unicidad, deben usar al menos uno de los campos de instancia como entrada. Los códigos hash no se deben calcular mediante los valores de los campos estáticos.
En el caso de las clases derivadas de Object, el GetHashCode
método puede delegar en la implementación de la clase GetHashCode() base solo si la clase derivada define la igualdad para ser igualdad de referencia. La implementación predeterminada de para los tipos de GetHashCode() referencia devuelve un código hash equivalente al devuelto por el GetHashCode(Object) método . Puede invalidar GetHashCode() los tipos de referencia inmutables. En general, para los tipos de referencia mutables, solo debe invalidar GetHashCode() si:
Puede calcular el código hash desde campos que no son mutables; O
Puede asegurarse de que el código hash de un objeto mutable no cambia mientras el objeto está contenido en una colección que se basa en su código hash.
De lo contrario, es posible que piense que el objeto mutable se pierde en la tabla hash. Si decide invalidar GetHashCode() un tipo de referencia mutable, la documentación debe aclarar que los usuarios del tipo no deben modificar los valores de objeto mientras el objeto se almacena en una tabla hash.
En el caso de los tipos de valor, GetHashCode() proporciona una implementación de código hash predeterminada que usa la reflexión. Debe considerar la posibilidad de invalidarla para mejorar el rendimiento.
Para obtener más información y ejemplos que calculan códigos hash de varias maneras, consulte la sección Ejemplos.
Una función hash debe tener las siguientes propiedades:
Si dos objetos se comparan como iguales, el GetHashCode() método de cada objeto debe devolver el mismo valor. Sin embargo, si dos objetos no se comparan como iguales, los GetHashCode() métodos de los dos objetos no tienen que devolver valores diferentes.
El GetHashCode() método de un objeto debe devolver de forma coherente el mismo código hash siempre que no haya ninguna modificación en el estado del objeto que determine el valor devuelto del método System.Object.Equals del objeto. Tenga en cuenta que esto solo 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 vuelve a ejecutar.
Para obtener el mejor rendimiento, una función hash debe generar una distribución uniforme para todas las entradas, incluida la entrada que está muy agrupada. Una implicación es que las pequeñas modificaciones en el estado del objeto deben dar lugar a modificaciones grandes en el código hash resultante para obtener el mejor rendimiento de la tabla hash.
Las funciones hash deben ser económicas para calcular.
El GetHashCode() método no debe producir excepciones.
Por ejemplo, la implementación del GetHashCode() método proporcionado por la String clase devuelve códigos hash idénticos para valores de cadena idénticos. Por lo tanto, dos String objetos devuelven el mismo código hash si representan el mismo valor de cadena. Además, el método usa todos los caracteres de la cadena para generar una salida distribuida aleatoriamente, incluso cuando la entrada se agrupa en determinados intervalos (por ejemplo, muchos usuarios pueden tener cadenas que contengan solo los 128 caracteres ASCII inferiores, aunque una cadena pueda contener cualquiera de los 65 535 caracteres Unicode).
Proporcionar una buena función hash en una clase puede afectar significativamente al rendimiento de agregar esos objetos a una tabla hash. En una tabla hash con claves que proporcionan una buena implementación de una función hash, la búsqueda de un elemento tarda constantemente (por ejemplo, una operación O(1). En una tabla hash con una implementación deficiente 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. Un usuario malintencionado puede introducir datos que aumentan el número de colisiones, lo que puede degradar significativamente el rendimiento de las aplicaciones que dependen de las tablas hash, en las condiciones siguientes:
Cuando las funciones hash producen colisiones frecuentes.
Cuando una gran proporción de objetos de una tabla hash produce códigos hash que son iguales o aproximadamente entre sí.
Cuando los usuarios introducen los datos desde los que se calcula el código hash.
Las clases derivadas que invalidan GetHashCode() también deben invalidar Equals(Object) para garantizar que dos objetos considerados iguales tengan el mismo código hash; de lo contrario, es posible que el Hashtable tipo no funcione correctamente.