¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

RuntimeHelpers.GetHashCode (Método) (Object)

Sirve como función hash para un objeto concreto, y es apropiado para su utilización en algoritmos hash y estructuras de datos que usan códigos hash, como las tablas hash.

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

public static int GetHashCode(
	Object o
)

Parámetros

o
Tipo: System.Object
Objeto cuyo código hash se va a recuperar.

Valor devuelto

Tipo: System.Int32
Código hash para el objeto identificado por el parámetro o.

El método RuntimeHelpers.GetHashCode siempre llama al método Object.GetHashCode,de forma no virtual, aun cuando el tipo del objeto haya invalidado el método Object.GetHashCode. Por consiguiente, mediante RuntimeHelpers.GetHashCode podría diferir de llamar directamente a GetHashCode en el objeto con el método Object.GetHashCode .

Nota de precauciónPrecaución

Aunque el método RuntimeHelpers.GetHashCode devuelve los códigos hash idénticos para referencias de objeto idénticas, no debería utilizar este método para comprobar la identidad del objeto, porque este código hash no identifica una referencia de objeto. Para probar el objeto identifique (es decir, probar que dos objetos hacen referencia al mismo objeto en memoria), cambie el método Object.ReferenceEquals . Ni debería utilizar GetHashCode para probar si dos cadenas representan referencias de objeto iguales, porque se interna la cadena. Para probar el grupo interno de cadenas, llame al método String.IsInterned .

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

  • Object.GetHashCode devuelve un código hash basado en la definición de objeto de igualdad. Por ejemplo, dos cadenas con el contenido idénticos devolverán el mismo valor para Object.GetHashCode.

  • RuntimeHelpers.GetHashCode devuelve un código hash que indique la identidad del objeto. Es decir, dos variables de cadena cuyo contenido son idénticos y que representan una cadena se interne que (vea la sección Internación de cadena ) o que representa una cadena única en códigos hash idénticos de memoria.

Nota importanteImportante

Observe que GetHashCode siempre devuelve los códigos hash idénticos para referencias de objeto iguales. Sin embargo, el inverso no es verdadera: códigos hash iguales no indican referencias de objeto iguales. Un valor de código hash determinado no es único a una referencia de objeto determinada; distintas referencias de objeto pueden generar códigos hash idénticos.

Los compiladores usan este método.

String Interning

El 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 calculan de un literal de cadena idéntico, CLR establecerá str1 y str2 para que señale a la misma ubicación en el montón administrado para conservar la memoria. Al llamar a RuntimeHelpers.GetHashCode en estos dos objetos de cadena, se generará el mismo código hash, contrariamente al segundo elemento con viñeta de la sección anterior.

El CLR sólo agrega los literales al grupo. Los resultados de las operaciones de cadenas como concatenación no se agregan al conjunto, a menos que el compilador resuelva la concatenación de cadenas como un literal de cadena. Por consiguiente, si str2 se creó como el resultado de una operación de concatenación, y str2 es idéntico a str1, al utilizar RuntimeHelpers.GetHashCode en estos dos objetos de cadena, no se generará el mismo código hash.

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

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

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

  • Ambos conjuntos de códigos hash para el primer conjunto de cadenas pasadas al método ShowHashCodes son diferentes, porque las cadenas son completamente diferentes.

  • Object.GetHashCode genera el mismo código hash para el segundo conjunto de cadenas pasadas al método ShowHashCodes , porque las cadenas son iguales. Sin embargo, el método RuntimeHelpers.GetHashCode no. La primera cadena se define utilizando un literal de cadena por lo que se interna. Aunque el valor de la segunda cadena es igual, no se interna, porque devuelve una llamada al método String.Format .

  • En el caso de la tercera cadena, los códigos hash mostrados por Object.GetHashCode para ambas cadenas son idénticos, al igual que los códigos hash mostrados por RuntimeHelpers.GetHashCode. Esto es porque el compilador ha tratado el valor asignado a ambas cadenas como único literal de cadena, por lo que las variables hacen referencia a la misma cadena internada.


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


.NET Framework

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

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.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:
© 2015 Microsoft