Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método RuntimeHelpers.GetHashCode (Object)

 

Publicado: noviembre de 2016

Sirve como función hash para un objeto determinado y es adecuado para su uso en algoritmos y estructuras de datos que usan los códigos hash, como una tabla hash.

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

public static int GetHashCode(
	object o
)

Parámetros

o
Type: System.Object

Recuperar el código hash de un objeto.

Valor devuelto

Type: System.Int32

Código hash para el objeto identificado por la o parámetro.

El RuntimeHelpers.GetHashCode método siempre se llama el Object.GetHashCode (método) no virtual, incluso si el tipo del objeto ha invalidado el Object.GetHashCode (método). Por tanto, RuntimeHelpers.GetHashCode pueden diferir de la llamada GetHashCode directamente en el objeto con el Object.GetHashCode método.

System_CAPS_warningAdvertencia

Aunque el RuntimeHelpers.GetHashCode método devuelve códigos hash idénticos para las referencias de objeto idéntico, no debe utilizar este método para comprobar la identidad del objeto, ya que este código hash no identifica una referencia de objeto. Para probar para identificar el objeto (es decir, para probar que dos objetos de referencia al mismo objeto en memoria), llame a la Object.ReferenceEquals (método). Tampoco debe utilizar GetHashCode para probar si dos cadenas representan referencias a objetos iguales, porque la cadena se aplica el método Intern. Para probar la asignación al grupo interno de cadenas, llame a la String.IsInterned (método).

El Object.GetHashCode y RuntimeHelpers.GetHashCode métodos difieren como sigue:

  • Object.GetHashCode Devuelve un código hash que se basa en la definición del objeto de igualdad. Por ejemplo, dos cadenas con contenido idéntico devolverá el mismo valor para Object.GetHashCode.

  • RuntimeHelpers.GetHashCode Devuelve un código hash que indica la identidad del objeto. Es decir, dos variables cuyo contenido es idéntico y que representan una cadena que se aplica el método Intern a cadenas (consulte la asignación al grupo interno de cadenas sección) o que representan una sola cadena en memoria devolver idénticos códigos hash.

System_CAPS_importantImportante

Tenga en cuenta que GetHashCode siempre devuelve códigos hash idénticos para las referencias de objeto igual. Sin embargo, lo contrario no es cierto: códigos hash igual no indican las referencias de objeto igual. Un valor de código hash en particular no es único en una referencia de objeto determinado; referencias a objetos diferentes pueden generar los códigos hash idénticos.

Este método se utiliza en los compiladores.

Common language runtime (CLR) mantiene un grupo interno de cadenas y almacena los literales en el grupo. Si dos cadenas (por ejemplo, str1 y str2) se forman una idéntica de literal de cadena, el CLR establecerá str1 y str2 para que apunte a la misma ubicación en el montón administrado para conservar memoria. Llamar a RuntimeHelpers.GetHashCode en la cadena de estos dos objetos generará el mismo código hash, al contrario que el segundo elemento con viñetas en la sección anterior.

El CLR sólo agrega los literales al grupo. Resultados de las operaciones de cadena como la concatenación no se agregan al grupo, a menos que el compilador resuelve la concatenación de cadenas como un literal de cadena único. Por lo tanto, si str2 se creó como resultado de una operación de concatenación, y str2 es idéntico a str1, con RuntimeHelpers.GetHashCode en la cadena de estos dos objetos no producirá el mismo código hash.

Si desea agregar explícitamente una cadena concatenada al grupo, use la String.Intern método.

También puede utilizar el String.IsInterned método para comprobar si una cadena tiene una referencia de método Intern.

En el ejemplo siguiente se muestra la diferencia entre el Object.GetHashCode y RuntimeHelpers.GetHashCode métodos. El resultado del ejemplo muestra lo siguiente:

  • Ambos conjuntos de códigos hash para el primer conjunto de cadenas que se pasan a la ShowHashCodes método son diferentes, porque las cadenas son completamente diferentes.

  • Object.GetHashCode genera el mismo código hash para el segundo conjunto de cadenas que se pasa a la ShowHashCodes método, porque las cadenas son iguales. Sin embargo, la RuntimeHelpers.GetHashCode método no lo hace. La primera cadena se define mediante un literal de cadena y por lo que se aplica el método Intern. Aunque el valor de la segunda cadena es la misma, no es aplica el método Intern, porque es devuelto por una llamada a la String.Format (método).

  • En el caso de la tercera cadena, los códigos hash generado por Object.GetHashCode para las dos cadenas son idénticas, como son los códigos hash generados por RuntimeHelpers.GetHashCode. Esto es debido a que el compilador trata el valor asignado a ambas cadenas como un literal de cadena único, por lo que hacen referencia las variables de cadena en la misma cadena aplicado el método Intern.

using System;
using System.Runtime.CompilerServices;

public class Example
{
   public static void Main()
   {
      Console.WriteLine("{0,-18} {1,6} {2,18:N0}    {3,6} {4,18:N0}\n",
                        "", "Var 1", "Hash Code", "Var 2", "Hash Code");

      // Get hash codes of two different strings.
      String sc1 = "String #1";
      String sc2 = "String #2";
      ShowHashCodes("sc1", sc1, "sc2", sc2);

      // Get hash codes of two identical non-interned strings.
      String s1 = "This string";
      String s2 = String.Format("{0} {1}", "This", "string");
      ShowHashCodes("s1", s1, "s2", s2);

      // Get hash codes of two (evidently concatenated) strings.
      String si1 = "This is a string!";
      String si2 = "This " + "is " + "a " + "string!";
      ShowHashCodes("si1", si1, "si2", si2);
   }

   private static void ShowHashCodes(String var1, Object value1, 
                                     String var2, Object value2)
   {
      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}",
                        "Obj.GetHashCode", var1, value1.GetHashCode(),
                        var2, value2.GetHashCode());

      Console.WriteLine("{0,-18} {1,6} {2,18:X8}    {3,6} {4,18:X8}\n",
                        "RTH.GetHashCode", var1, RuntimeHelpers.GetHashCode(value1),
                        var2, RuntimeHelpers.GetHashCode(value2));
   }
}
// The example displays output similar to the following:
//                        Var 1          Hash Code     Var 2          Hash Code
//    
//    Obj.GetHashCode       sc1           94EABD27       sc2           94EABD24
//    RTH.GetHashCode       sc1           02BF8098       sc2           00BB8560
//    
//    Obj.GetHashCode        s1           29C5A397        s2           29C5A397
//    RTH.GetHashCode        s1           0297B065        s2           03553390
//    
//    Obj.GetHashCode       si1           941BCEA5       si2           941BCEA5
//    RTH.GetHashCode       si1           01FED012       si2           01FED012

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: