# Object.GetHashCode Method

## Definition

Sirve como la función hash predeterminada.Serves as the default hash function.

``````public:
virtual int GetHashCode();``````
``public virtual int GetHashCode ();``
``````abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int``````
``Public Overridable Function GetHashCode () As Integer``

#### Returns

Int32

Código hash para el objeto actual.A hash code for the current object.

## Examples

Una de las formas más sencillas de calcular un código hash para un valor numérico que tiene el mismo intervalo o un rango menor que el Int32 tipo es devolver simplemente ese valor.One of the simplest ways to compute a hash code for a numeric value that has the same or a smaller range than the Int32 type is to simply return that value. En el ejemplo siguiente se muestra este tipo de implementación para una estructura de `Number`.The following example shows such an implementation for a `Number` structure.

``````using System;

public struct Number
{
private int n;

public Number(int value)
{
n = value;
}

public int Value
{
get { return n; }
}

public override bool Equals(Object obj)
{
if (obj == null || ! (obj is Number))
return false;
else
return n == ((Number) obj).n;
}

public override int GetHashCode()
{
return n;
}

public override string ToString()
{
return n.ToString();
}
}

public class Example
{
public static void Main()
{
Random rnd = new Random();
for (int ctr = 0; ctr <= 9; ctr++) {
int randomN = rnd.Next(Int32.MinValue, Int32.MaxValue);
Number n = new Number(randomN);
Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode());
}
}
}
// The example displays output like the following:
//       n =   -634398368, hash code =   -634398368
//       n =   2136747730, hash code =   2136747730
//       n =  -1973417279, hash code =  -1973417279
//       n =   1101478715, hash code =   1101478715
//       n =   2078057429, hash code =   2078057429
//       n =   -334489950, hash code =   -334489950
//       n =    -68958230, hash code =    -68958230
//       n =   -379951485, hash code =   -379951485
//       n =    -31553685, hash code =    -31553685
//       n =   2105429592, hash code =   2105429592
``````
``````Public Structure Number
Private n As Integer

Public Sub New(value As Integer)
n = value
End Sub

Public ReadOnly Property Value As Integer
Get
Return n
End Get
End Property

Public Overrides Function Equals(obj As Object) As Boolean
If obj Is Nothing OrElse Not TypeOf obj Is Number Then
Return False
Else
Return n = CType(obj, Number).n
End If
End Function

Public Overrides Function GetHashCode() As Integer
Return n
End Function

Public Overrides Function ToString() As String
Return n.ToString()
End Function
End Structure

Module Example
Public Sub Main()
Dim rnd As New Random()
For ctr As Integer = 0 To 9
Dim randomN As Integer = rnd.Next(Int32.MinValue, Int32.MaxValue)
Dim n As New Number(randomN)
Console.WriteLine("n = {0,12}, hash code = {1,12}", n, n.GetHashCode())
Next
End Sub
End Module
' The example displays output like the following:
'       n =   -634398368, hash code =   -634398368
'       n =   2136747730, hash code =   2136747730
'       n =  -1973417279, hash code =  -1973417279
'       n =   1101478715, hash code =   1101478715
'       n =   2078057429, hash code =   2078057429
'       n =   -334489950, hash code =   -334489950
'       n =    -68958230, hash code =    -68958230
'       n =   -379951485, hash code =   -379951485
'       n =    -31553685, hash code =    -31553685
'       n =   2105429592, hash code =   2105429592
``````

Con frecuencia, un tipo tiene varios campos de datos que pueden participar en la generación del código hash.Frequently, a type has multiple data fields that can participate in generating the hash code. Una manera de generar un código hash es combinar estos campos mediante una operación de `XOR (eXclusive OR)`, como se muestra en el ejemplo siguiente.One way to generate a hash code is to combine these fields using an `XOR (eXclusive OR)` operation, as shown in the following example.

``````using System;

// A type that represents a 2-D point.
public struct Point
{
private int x;
private int y;

public Point(int x, int y)
{
this.x = x;
this.y = y;
}

public override bool Equals(Object obj)
{
if (! (obj is Point)) return false;

Point p = (Point) obj;
return x == p.x & y == p.y;
}

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

public class Example
{
public static void Main()
{
Point pt = new Point(5, 8);
Console.WriteLine(pt.GetHashCode());

pt = new Point(8, 5);
Console.WriteLine(pt.GetHashCode());
}
}
// The example displays the following output:
//       13
//       13
``````
``````' A type that represents a 2-D point.
Public Structure Point
Private x As Integer
Private y As Integer

Public Sub New(x As Integer, y As Integer)
Me.x = x
Me.y = y
End Sub

Public Overrides Function Equals(obj As Object) As Boolean
If Not TypeOf obj Is Point Then Return False

Dim p As Point = CType(obj, Point)
Return x = p.x And y = p.y
End Function

Public Overrides Function GetHashCode() As Integer
Return x Xor y
End Function
End Structure

Public Module Example
Public Sub Main()
Dim pt As New Point(5, 8)
Console.WriteLine(pt.GetHashCode())

pt = New Point(8, 5)
Console.WriteLine(pt.GetHashCode())
End Sub
End Module
``````

En el ejemplo anterior se devuelve el mismo código hash para (N1, N2) y (N2, N1), por lo que es posible que se generen más colisiones de las deseadas.The previous example returns the same hash code for (n1, n2) and (n2, n1), and so may generate more collisions than are desirable. Hay varias soluciones disponibles para que los códigos hash en estos casos no sean idénticos.A number of solutions are available so that hash codes in these cases are not identical. Uno es devolver el código hash de un objeto `Tuple` que refleje el orden de cada campo.One is to return the hash code of a `Tuple` object that reflects the order of each field. En el ejemplo siguiente se muestra una posible implementación que usa la clase Tuple<T1,T2>.The following example shows a possible implementation that uses the Tuple<T1,T2> class. Sin embargo, tenga en cuenta que la sobrecarga de rendimiento que supone crear una instancia de un objeto `Tuple` puede afectar significativamente al rendimiento general de una aplicación que almacena un gran número de objetos en tablas hash.Note, though, that the performance overhead of instantiating a `Tuple` object may significantly impact the overall performance of an application that stores large numbers of objects in hash tables.

``````using System;

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

public Point(int x, int y)
{
this.x = x;
this.y = y;
}

public override bool Equals(Object obj)
{
if (!(obj is Point)) return false;

Point p = (Point) obj;
return x == p.x & y == p.y;
}

public override int GetHashCode()
{
return Tuple.Create(x, y).GetHashCode();
}
}

public class Example
{
public static void Main()
{
Point pt = new Point(5, 8);
Console.WriteLine(pt.GetHashCode());

pt = new Point(8, 5);
Console.WriteLine(pt.GetHashCode());
}
}
// The example displays the following output:
//       173
//       269
``````
``````Public Structure Point
Private x As Integer
Private y As Integer

Public Sub New(x As Integer, y As Integer)
Me.x = x
Me.y = y
End Sub

Public Overrides Function Equals(obj As Object) As Boolean
If Not TypeOf obj Is Point Then Return False

Dim p As Point = CType(obj, Point)
Return x = p.x And y = p.y
End Function

Public Overrides Function GetHashCode() As Integer
Return Tuple.Create(x, y).GetHashCode()
End Function
End Structure

Public Module Example
Public Sub Main()
Dim pt As New Point(5, 8)
Console.WriteLine(pt.GetHashCode())

pt = New Point(8, 5)
Console.WriteLine(pt.GetHashCode())
End Sub
End Module
' The example displays the following output:
'       173
'       269
``````

Una segunda solución alternativa implica ponderar los códigos hash individuales al desplazarse a la izquierda de los códigos hash de los campos sucesivos por dos o más bits.A second alternative solution involves weighting the individual hash codes by left-shifting the hash codes of successive fields by two or more bits. De forma óptima, los bits desplazados más allá del bit 31 deben ajustarse en lugar de descartarse.Optimally, bits shifted beyond bit 31 should wrap around rather than be discarded. Dado que los operadores de desplazamiento a la izquierda descartan bits en C# y Visual Basic, esto requiere la creación de un método de desplazamiento y ajuste izquierdo como el siguiente:Since bits are discarded by the left-shift operators in both C# and Visual Basic, this requires creating a left shift-and-wrap method like the following:

``````public int ShiftAndWrap(int value, int positions)
{
positions = positions & 0x1F;

// Save the existing bit pattern, but interpret it as an unsigned integer.
uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
// Preserve the bits to be discarded.
uint wrapped = number >> (32 - positions);
// Shift and wrap the discarded bits.
return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
}
``````
``````Public Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
positions = positions And &h1F

' Save the existing bit pattern, but interpret it as an unsigned integer.
Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
' Preserve the bits to be discarded.
Dim wrapped AS UInteger = number >> (32 - positions)
' Shift and wrap the discarded bits.
Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
End Function
``````

En el ejemplo siguiente se usa este método de desplazamiento y ajuste para calcular el código hash de la estructura `Point` utilizada en los ejemplos anteriores.The following example then uses this shift-and-wrap method to compute the hash code of the `Point` structure used in the previous examples.

``````using System;

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

public Point(int x, int y)
{
this.x = x;
this.y = y;
}

public override bool Equals(Object obj)
{
if (!(obj is Point)) return false;

Point p = (Point) obj;
return x == p.x & y == p.y;
}

public override int GetHashCode()
{
return ShiftAndWrap(x.GetHashCode(), 2) ^ y.GetHashCode();
}

private int ShiftAndWrap(int value, int positions)
{
positions = positions & 0x1F;

// Save the existing bit pattern, but interpret it as an unsigned integer.
uint number = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0);
// Preserve the bits to be discarded.
uint wrapped = number >> (32 - positions);
// Shift and wrap the discarded bits.
return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) | wrapped), 0);
}
}

public class Example
{
public static void Main()
{
Point pt = new Point(5, 8);
Console.WriteLine(pt.GetHashCode());

pt = new Point(8, 5);
Console.WriteLine(pt.GetHashCode());
}
}
// The example displays the following output:
//       28
//       37
``````
``````Public Structure Point
Private x As Integer
Private y As Integer

Public Sub New(x As Integer, y As Integer)
Me.x = x
Me.y = y
End Sub

Public Overrides Function Equals(obj As Object) As Boolean
If Not TypeOf obj Is Point Then Return False

Dim p As Point = CType(obj, Point)
Return x = p.x And y = p.y
End Function

Public Overrides Function GetHashCode() As Integer
Return ShiftAndWrap(x.GetHashCode(), 2) XOr y.GetHashCode()
End Function

Private Function ShiftAndWrap(value As Integer, positions As Integer) As Integer
positions = positions And &h1F

' Save the existing bit pattern, but interpret it as an unsigned integer.
Dim number As UInteger = BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)
' Preserve the bits to be discarded.
Dim wrapped AS UInteger = number >> (32 - positions)
' Shift and wrap the discarded bits.
Return BitConverter.ToInt32(BitConverter.GetBytes((number << positions) Or wrapped), 0)
End Function
End Structure

Module Example
Public Sub Main()
Dim pt As New Point(5, 8)
Console.WriteLine(pt.GetHashCode())

pt = New Point(8, 5)
Console.WriteLine(pt.GetHashCode())
End Sub
End Module
' The example displays the following output:
'       28
'       37
``````

## Remarks

Un código hash es un valor numérico que se utiliza para insertar e identificar un objeto en una colección basada en hash, como la clase Dictionary<TKey,TValue>, la clase Hashtable o un tipo derivado de la clase DictionaryBase.A hash code is a numeric value that is used to insert and identify an object in a hash-based collection such as the Dictionary<TKey,TValue> class, the Hashtable class, or a type derived from the DictionaryBase class. El método GetHashCode proporciona este código hash para los algoritmos que necesitan comprobaciones rápidas de igualdad de objetos.The GetHashCode method provides this hash code for algorithms that need quick checks of object equality.

Note

Para obtener información sobre cómo se usan los códigos hash en las tablas hash y para algunos algoritmos de código hash adicionales, vea la entrada de la función hash en Wikipedia.For information about how hash codes are used in hash tables and for some additional hash code algorithms, see the Hash Function entry in Wikipedia.

Dos objetos que son iguales devuelven códigos hash que son iguales.Two objects that are equal return hash codes that are equal. Sin embargo, lo contrario no es cierto: los códigos hash iguales no implican la igualdad de objetos, porque los objetos diferentes (distintos) pueden tener códigos hash idénticos.However, the reverse is not true: equal hash codes do not imply object equality, because different (unequal) objects can have identical hash codes. Además, .NET no garantiza la implementación predeterminada del método GetHashCode y el valor devuelto por este método puede diferir entre las implementaciones de .NET, como las distintas versiones de .NET Framework y .NET Core, y las plataformas, como las plataformas 32 y 64 bits.Furthermore, .NET does not guarantee the default implementation of the GetHashCode method, and the value this method returns may differ between .NET implementations, such as different versions of .NET Framework and .NET Core, and platforms, such as 32-bit and 64-bit platforms. Por estos motivos, no use la implementación predeterminada de este método como identificador de objeto único para la aplicación de algoritmos hash.For these reasons, do not use the default implementation of this method as a unique object identifier for hashing purposes. A continuación se indican dos consecuencias:Two consequences follow from this:

• No debe suponer que los códigos hash iguales impliquen la igualdad de objetos.You should not assume that equal hash codes imply object equality.

• Nunca debe conservar o usar un código hash fuera del dominio de aplicación en el que se creó, porque el mismo objeto puede aplicar un algoritmo hash a través de dominios de aplicación, procesos y plataformas.You should never persist or use a hash code outside the application domain in which it was created, because the same object may hash across application domains, processes, and platforms.

Warning

Un código hash está pensado para la inserción y búsqueda eficaces en colecciones basadas en una tabla hash.A hash code is intended for efficient insertion and lookup in collections that are based on a hash table. Un código hash no es un valor permanente.A hash code is not a permanent value. Por esta razón:For this reason:

• No serialice valores de código hash ni los almacene en bases de datos.Do not serialize hash code values or store them in databases.
• No utilice el código hash como clave para recuperar un objeto de una colección con clave.Do not use the hash code as the key to retrieve an object from a keyed collection.
• No envíe códigos hash entre los dominios de aplicación o los procesos.Do not send hash codes across application domains or processes. En algunos casos, los códigos hash se pueden calcular por cada proceso o dominio por aplicación.In some cases, hash codes may be computed on a per-process or per-application domain basis.
• No utilice el código hash en lugar de un valor devuelto por una función de hash criptográfica si necesita un hash criptográficamente seguro.Do not use the hash code instead of a value returned by a cryptographic hashing function if you need a cryptographically strong hash. En el caso de los hashes criptográficos, utilice una clase derivada de la clase System.Security.Cryptography.HashAlgorithm o System.Security.Cryptography.KeyedHashAlgorithm.For cryptographic hashes, use a class derived from the System.Security.Cryptography.HashAlgorithm or System.Security.Cryptography.KeyedHashAlgorithm class.
• No pruebe la igualdad de códigos hash para determinar si dos objetos son iguales.Do not test for equality of hash codes to determine whether two objects are equal. (Los objetos distintos pueden tener códigos hash idénticos). Para comprobar la igualdad, llame al método ReferenceEquals o Equals.(Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.

Un tipo derivado puede invalidar el método GetHashCode.The GetHashCode method can be overridden by a derived type. Si no se reemplaza GetHashCode, los códigos hash de los tipos de referencia se calculan llamando al método Object.GetHashCode de la clase base, que calcula un código hash basado en la referencia de un objeto. para obtener más información, vea RuntimeHelpers.GetHashCode.If GetHashCode is not overridden, hash codes for reference types are computed by calling the Object.GetHashCode method of the base class, which computes a hash code based on an object's reference; for more information, see RuntimeHelpers.GetHashCode. En otras palabras, dos objetos para los que el método ReferenceEquals devuelve `true` tienen códigos hash idénticos.In other words, two objects for which the ReferenceEquals method returns `true` have identical hash codes. Si los tipos de valor no invalidan GetHashCode, el método ValueType.GetHashCode de la clase base utiliza la reflexión para calcular el código hash basándose en los valores de los campos del tipo.If value types do not override GetHashCode, the ValueType.GetHashCode method of the base class uses reflection to compute the hash code based on the values of the type's fields. En otras palabras, los tipos de valor cuyos campos tienen los mismos valores tienen los mismos códigos hash.In other words, value types whose fields have equal values have equal hash codes. Para obtener más información sobre cómo invalidar GetHashCode, vea la sección "notas a los herederos".For more information about overriding GetHashCode, see the "Notes to Inheritors" section.

Warning

Si invalida el método GetHashCode, también debe invalidar Equalsy viceversa.If you override the GetHashCode method, you should also override Equals, and vice versa. Si el método Equals invalidado devuelve `true` cuando se comprueba la igualdad de dos objetos, el método GetHashCode invalidado debe devolver el mismo valor para los dos objetos.If your overridden Equals method returns `true` when two objects are tested for equality, your overridden GetHashCode method must return the same value for the two objects.

Si un objeto que se utiliza como clave en una tabla hash no proporciona una implementación útil de GetHashCode, puede especificar un proveedor de código hash proporcionando una implementación de IEqualityComparer a una de las sobrecargas del constructor de clase Hashtable.If an object that is used as a key in a hash table does not provide a useful implementation of GetHashCode, you can specify a hash code provider by supplying an IEqualityComparer implementation to one of the overloads of the Hashtable class constructor.

### Notas del Windows en tiempo de ejecuciónWindows RuntimeNotes for the Windows en tiempo de ejecuciónWindows Runtime

Cuando se llama al método GetHashCode en una clase del Windows en tiempo de ejecuciónWindows Runtime, proporciona el comportamiento predeterminado para las clases que no invalidan GetHashCode.When you call the GetHashCode method on a class in the Windows en tiempo de ejecuciónWindows Runtime, it provides the default behavior for classes that don't override GetHashCode. Esto forma parte de la compatibilidad que proporciona el .NET Framework para la Windows en tiempo de ejecuciónWindows Runtime (vea compatibilidad con .NET Framework para aplicaciones de la tienda Windows y Windows Runtime).This is part of the support that the .NET Framework provides for the Windows en tiempo de ejecuciónWindows Runtime (see .NET Framework Support for Windows Store Apps and Windows Runtime). Las clases de la Windows en tiempo de ejecuciónWindows Runtime no heredan Objecty actualmente no implementan una GetHashCode.Classes in the Windows en tiempo de ejecuciónWindows Runtime don't inherit Object, and currently don't implement a GetHashCode. Sin embargo, parece que tienen métodos ToString, Equals(Object)y GetHashCode cuando se usan en el C# código de o Visual Basic y el .NET Framework proporciona el comportamiento predeterminado de estos métodos.However, they appear to have ToString, Equals(Object), and GetHashCode methods when you use them in your C# or Visual Basic code, and the .NET Framework provides the default behavior for these methods.

Note

Windows en tiempo de ejecuciónWindows Runtime clases escritas en C# o Visual Basic pueden invalidar el método GetHashCode.classes that are written in C# or Visual Basic can override the GetHashCode method.

## Notes to Inheritors

Una función hash se utiliza para generar rápidamente un número (código hash) que corresponde al valor de un objeto.A hash function is used to quickly generate a number (hash code) that corresponds to the value of an object. Las funciones hash suelen ser específicas de cada tipo y, por unicidad, deben usar al menos uno de los campos de instancia como entrada.Hash functions are usually specific to each type and, for uniqueness, must use at least one of the instance fields as input. Los códigos hash no deben calcularse utilizando los valores de los campos estáticos.Hash codes should not be computed by using the values of static fields.

Para las clases derivadas de Object, el método `GetHashCode` se puede delegar a la clase base GetHashCode() implementación solo si la clase derivada define la igualdad para ser la igualdad de referencia.For classes derived from Object, the `GetHashCode` method can delegate to the base class GetHashCode() implementation only if the derived class defines equality to be reference equality. La implementación predeterminada de GetHashCode() para los tipos de referencia devuelve un código hash que es equivalente al devuelto por el método GetHashCode(Object).The default implementation of GetHashCode() for reference types returns a hash code that is equivalent to the one returned by the GetHashCode(Object) method. Puede invalidar GetHashCode() para los tipos de referencia inmutables.You can override GetHashCode() for immutable reference types. En general, en el caso de los tipos de referencia mutable, solo debe invalidar GetHashCode() si:In general, for mutable reference types, you should override GetHashCode() only if: -Puede calcular el código hash a partir de campos que no son mutables; de- You can compute the hash code from fields that are not mutable; or -Puede asegurarse de que el código hash de un objeto mutable no cambie mientras el objeto está contenido en una colección que se basa en su código hash.- You can ensure that the hash code of a mutable object does not change while the object is contained in a collection that relies on its hash code.

De lo contrario, es posible que piense que el objeto mutable se pierde en la tabla hash.Otherwise, you might think that the mutable object is lost in the hash table. Si elige invalidar GetHashCode() para un tipo de referencia mutable, la documentación debe dejar claro que los usuarios de su tipo no deben modificar los valores de objeto mientras el objeto se almacena en una tabla hash.If you do choose to override GetHashCode() for a mutable reference type, your documentation should make it clear that users of your type should not modify object values while the object is stored in a hash table.

En el caso de los tipos de valor, GetHashCode() proporciona una implementación de código hash predeterminada que utiliza la reflexión.For value types, GetHashCode() provides a default hash code implementation that uses reflection. Considere la posibilidad de invalidarlo para mejorar el rendimiento.You should consider overriding it for better performance.

Para obtener más información y ejemplos que calculan códigos hash de diversas formas, vea la sección ejemplos.For more information and examples that compute hash codes in a variety of ways, see the Examples section.