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 String.GetHashCode ()

 

Publicado: octubre de 2016

Devuelve el código hash para esta cadena.

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

public override int GetHashCode()

Valor devuelto

Type: System.Int32

Código hash de un entero de 32 bits con signo.

El comportamiento de GetHashCode depende de su implementación, lo que podría cambiar de una versión de common language runtime a otro. Un motivo por qué esto puede ocurrir es mejorar el rendimiento de GetHashCode.

System_CAPS_importantImportante

Si dos objetos de cadena son iguales, la GetHashCode método devuelve valores idénticos. Sin embargo, no hay un valor de código hash único para cada valor de cadena único. Cadenas diferentes pueden devolver el mismo código hash.

El propio código de hash no se garantiza que sea estable. Códigos hash de cadenas idénticas pueden diferir en las versiones de .NET Framework y en plataformas (por ejemplo, 32 bits y 64 bits) para una única versión de .NET Framework. En algunos casos, incluso puede diferir por dominio de aplicación.

Como resultado, hash códigos nunca deben utilizarse fuera del dominio de aplicación en el que fueron creadas, nunca deben usarse como campos de clave en una colección y que nunca se deben conservar.

Por último, no utilice el código hash en lugar de un valor devuelto por una función hash criptográfica si necesita un hash criptográficamente seguro. Para valores hash criptográficos, utilice una clase derivada de la System.Security.Cryptography.HashAlgorithm o System.Security.Cryptography.KeyedHashAlgorithm clase.

Para obtener más información sobre los códigos hash, vea Object.GetHashCode.

En aplicaciones de escritorio, puede usar el <UseRandomizedStringHashAlgorithm>elemento para generar códigos hash únicos en un cada dominio de aplicación.</UseRandomizedStringHashAlgorithm> Esto puede reducir el número de colisiones y mejorar el rendimiento general de las inserciones y búsquedas que usan las tablas hash. En el ejemplo siguiente se muestra cómo utilizar el <UseRandomizedStringHashAlgorithm>elemento.</UseRandomizedStringHashAlgorithm> Define un para generar códigos hash únicos en un cada dominio de aplicación. Esto puede reducir el número de colisiones y mejorar el rendimiento general de las inserciones y búsquedas que usan las tablas hash. En el ejemplo siguiente se muestra cómo usar la. Define un DisplayString clase que incluya una constante de cadena privada, s, cuyo valor es "Es una cadena". También incluye una ShowStringHashCode método que muestra el valor de cadena y su código hash junto con el nombre del dominio de aplicación en el que se ejecuta el método.

using System;

public class Example
{
   public static void Main()
   {
      // Show hash code in current domain.
      DisplayString display = new DisplayString();
      display.ShowStringHashCode();

      // Create a new app domain and show string hash code.
      AppDomain domain = AppDomain.CreateDomain("NewDomain");
      var display2 = (DisplayString) domain.CreateInstanceAndUnwrap(typeof(Example).Assembly.FullName, 
                                                          "DisplayString");   
      display2.ShowStringHashCode();
   }
}

public class DisplayString : MarshalByRefObject
{
   private String s = "This is a string.";

   public override bool Equals(Object obj)
   {
      String s2 = obj as String; 
      if (s2 == null)
         return false;
      else
         return s == s2; 
   }

   public bool Equals(String str)
   {
      return s == str;
   }    

   public override int GetHashCode()
   {
      return s.GetHashCode();
   }

   public override String ToString() 
   {
      return s;
   }

   public void ShowStringHashCode()
   {
      Console.WriteLine("String '{0}' in domain '{1}': {2:X8}",
                        s, AppDomain.CurrentDomain.FriendlyName, 
                        s.GetHashCode());
   }
}

Al ejecutar el ejemplo sin proporcionar un archivo de configuración, muestra un resultado similar al siguiente. Tenga en cuenta que los códigos hash de la cadena son idénticos en los dos dominios de aplicación.


String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC
String 'This is a string.' in domain 'NewDomain': 941BCEAC

Sin embargo, si agrega el siguiente archivo de configuración al directorio del ejemplo y, a continuación, ejecutar el ejemplo, los códigos hash de la misma cadena variarán por dominio de aplicación.


<?xml version ="1.0"?>
<configuration>
   <runtime>
      <UseRandomizedStringHashAlgorithm enabled="1" />
   </runtime>
</configuration>

Cuando el archivo de configuración está presente, el ejemplo muestra el siguiente resultado:


String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236

System_CAPS_importantImportante

Códigos hash se utilizan para insertar y recuperar los objetos con clave de las tablas hash eficazmente. Sin embargo, códigos hash no identificar cadenas. Cadenas idénticas tienen códigos hash iguales, pero common language runtime también puede asignar el mismo código hash para cadenas diferentes. Además, los códigos hash pueden variar según la versión de .NET Framework, dentro de una única versión de la plataforma y por dominio de aplicación. Por este motivo, no debe serializar ni conservar los valores de código hash, ni debe usarlas como claves en una tabla hash o un diccionario.

Para obtener información adicional sobre el uso de códigos hash y el GetHashCode método, consulte Object.GetHashCode.

Notas para llamadores:

El valor devuelto por GetHashCode depende de la plataforma. Es diferente en las versiones de 32 bits y 64 bits de .NET Framework. También puede diferir entre las versiones de .NET Framework.

System_CAPS_warningAdvertencia

Un código hash está destinado a una inserción y búsqueda en las colecciones que se basan en una tabla hash. Un código hash no es un valor permanente. Por esta razón:

  • No serializar los valores de código hash o almacenarlos en las bases de datos.

  • No utilice el código hash como clave para recuperar un objeto de una colección con clave.

  • No utilice el código hash en lugar de un valor devuelto por una función hash criptográfica. Para valores hash criptográficos, utilice una clase derivada de la System.Security.Cryptography.HashAlgorithm o System.Security.Cryptography.KeyedHashAlgorithm clase.

  • No comprobar la igualdad de los códigos hash para determinar si dos objetos son iguales. (Objetos distintos pueden tener códigos hash idénticos). Para comprobar la igualdad, llame a la ReferenceEqualso Equals método.

En el ejemplo siguiente se muestra el GetHashCode método utilizando varias cadenas de entrada.

using System;

class GetHashCode 
{
    public static void Main() 
    {
        DisplayHashCode( "" );
        DisplayHashCode( "a" );
        DisplayHashCode( "ab" );
        DisplayHashCode( "abc" );
        DisplayHashCode( "abd" );
        DisplayHashCode( "abe" );
        DisplayHashCode( "abcdef" );
        DisplayHashCode( "abcdeg" );
        DisplayHashCode( "abcdeh" );
        DisplayHashCode( "abcdei" );
        DisplayHashCode( "Abcdeg" );
        DisplayHashCode( "Abcdeh" );
        DisplayHashCode( "Abcdei" );
    }

    static void DisplayHashCode( String Operand )
    {
        int     HashCode = Operand.GetHashCode( );
        Console.WriteLine("The hash code for \"{0}\" is: 0x{1:X8}, {1}",
                          Operand, HashCode );
    }
}
/*
      This example displays output like the following:
      The hash code for "" is: 0x2D2816FE, 757602046
      The hash code for "a" is: 0xCDCAB7BF, -842352705
      The hash code for "ab" is: 0xCDE8B7BF, -840386625
      The hash code for "abc" is: 0x2001D81A, 536991770
      The hash code for "abd" is: 0xC2A94CB5, -1029092171
      The hash code for "abe" is: 0x6550C150, 1699791184
      The hash code for "abcdef" is: 0x1762906D, 392335469
      The hash code for "abcdeg" is: 0x1763906D, 392401005
      The hash code for "abcdeh" is: 0x175C906D, 391942253
      The hash code for "abcdei" is: 0x175D906D, 392007789
      The hash code for "Abcdeg" is: 0x1763954D, 392402253
      The hash code for "Abcdeh" is: 0x175C954D, 391943501
      The hash code for "Abcdei" is: 0x175D954D, 392009037
*/

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: