Exportar (0) Imprimir
Expandir todo
Expandir Minimizar
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

String.GetHashCode (Método)

Devuelve el código hash para esta cadena.

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

public override int GetHashCode()

Valor devuelto

Tipo: System.Int32
Código hash de un entero de 32 bits con signo.

El comportamiento del método GetHashCode depende de su implementación, que puede cambiar de una versión a otra de Common Language Runtime. Una de las razones por las que puede ocurrir esto es para mejorar el rendimiento del método GetHashCode.

Nota importanteImportante

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

El código hash en sí no se garantiza que sea estable. Los códigos hash de cadenas idénticas pueden diferir entre versiones de.NET Framework y entre plataformas (como de 32 bits y 64 bits) para una única versión de .NET Framework. En algunos casos, pueden incluso diferencia en el dominio de aplicación.

Como resultado, los códigos hash nunca deben utilizar fuera del dominio de aplicación en el que se crearon, se deben utilizarse nunca como campos clave de una colección, y no deben guardarse.

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

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

En aplicaciones de escritorio, puede utilizar <UseRandomizedStringHashAlgorithm> elemento para generar códigos hash únicos por el dominio de aplicación. Esto puede reducir el número de conflictos y mejorar el rendimiento global de las inserciones y las búsquedas que utilizan tablas hash. El ejemplo siguiente se muestra cómo utilizar <UseRandomizedStringHashAlgorithm> elemento. Define una clase que incluya una constante de cadena privada, sde DisplayString , cuyo valor es “This is a string”. También incluye un método ShowStringHashCode que presenta 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());
   }
}


Cuando ejecute el ejemplo sin proporcionar un archivo de configuración, mostrará un resultado similar al siguiente. Observe 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 archivo de configuración siguiente al directorio de ejemplo y, a continuación, ejecuta el ejemplo, los códigos hash para la misma cadena diferirán en función del 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

Nota importanteImportante

Los códigos hash se utilizan para insertar y recuperar objetos cerrados de las tablas hash eficazmente. Sin embargo, los códigos hash no identifican de forma única las cadenas. Las cadenas idénticas tienen códigos hash iguales, pero Common Language Runtime puede asignar el mismo código hash a diferentes cadenas. Además, los códigos hash pueden variar según la versión de .NET Framework, en plataforma dentro de una única versión, y el dominio de aplicación. Debido a esto, no debe serializar o conservar los valores de código hash, ni debe utilizarlas como claves en una tabla hash o un diccionario.

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

Notas para los llamadores

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

Nota de precauciónPrecaución

Un código hash está pensado para la inserción y la búsqueda eficaces en las colecciones basadas en una tabla hash. Un código hash no es un valor permanente. Por este motivo:

  • No serialice los valores de código hash ni almacénelos en bases de datos.

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

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

  • No pruebe la igualdad de códigos hash para determinar si dos objetos son iguales. (Los objetos distintos pueden tener códigos hash idénticos). Para comprobar la igualdad, llame al método de ReferenceEquals o de Equals .

En el siguiente ejemplo se muestra el método GetHashCode usando 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
*/


.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.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

.NET para aplicaciones de Windows Phone

Compatible con: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 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:
© 2014 Microsoft