Questa pagina è stata utile?
I suggerimenti relativi al contenuto di questa pagina sono importanti. Comunicaceli.
Altri suggerimenti?
1500 caratteri rimanenti
Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Metodo String.GetHashCode

Restituisce il codice hash per questa stringa.

Spazio dei nomi:  System
Assembly:  mscorlib (in mscorlib.dll)

public override int GetHashCode()

Valore restituito

Tipo: System.Int32
Un codice hash intero con segno a 32 bit.

Il comportamento del metodo GetHashCode dipende dalla relativa implementazione, che potrebbe variare da una versione all'altra di Common Language Runtime. Tali variazioni possono verificarsi al fine di migliorare le prestazioni del metodo GetHashCode.

Nota importanteImportante

Se due oggetti stringa sono uguali, il metodo GetHashCode restituisce valori identici. Non esiste, tuttavia, un valore di codice hash univoco per ogni valore di stringa univoco. Stringhe diverse possono restituire lo stesso codice hash.

Non è garantito che il codice hash sia stabile. I codici hash per le stringhe identiche possono presentare differenze tra le versioni di .NET Framework e tra le piattaforme (come 32 bit e 64 bit) per una singola versione di .NET Framework. In alcuni casi, possono anche differire dal dominio dell'applicazione.

Di conseguenza, i codici hash non devono mai essere utilizzati all'esterno del dominio dell'applicazione in cui sono stati creati, ma non devono mai essere utilizzati come campi chiave in una raccolta e non devono mai essere mantenuti.

Infine, non deve essere utilizzato il codice hash al posto di un valore restituito da una funzione di crittografia di hashing se è necessaria una crittografia robusta basata su hash. Per gli hash di crittografia, utilizzare la classe derivata dalla classe System.Security.Cryptography.KeyedHashAlgorithm o System.Security.Cryptography.HashAlgorithm.

Per ulteriori informazioni sui codici hash, vedere Object.GetHashCode.

Nelle applicazioni desktop, è possibile utilizzare l'elemento <UseRandomizedStringHashAlgorithm> per generare i codici hash univoci in base al dominio dell'applicazione. Ciò può ridurre il numero di conflitti e migliorare le prestazioni globali degli inserimenti e le ricerche che utilizzano le tabelle hash. Nell'esempio riportato di seguito viene mostrato come utilizzare l'elemento <UseRandomizedStringHashAlgorithm>. Viene definita una classe DisplayString che include una costante di stringa privata, s, il cui valore è "Questa è una stringa." Viene inoltre incluso un metodo ShowStringHashCode tramite cui vengono visualizzati il valore stringa e il codice hash con il nome del dominio applicazione in cui il metodo è in esecuzione.


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());
   }
}


Quando si esegue l'esempio senza fornire un file di configurazione, restituisce un output analogo al seguente. Si noti che i codici hash per la stringa sono identici nei due domini applicazione.


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

Tuttavia, se si aggiunge il file di configurazione seguente alla directory di esempio e, successivamente, si esegue l'esempio, i codici hash per la stessa stringa risulteranno diversi dal dominio dell'applicazione.


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

Quando il file di configurazione è presente, l'esempio visualizza il seguente output:


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

Nota importanteImportante

I codici hash vengono utilizzati per inserire in modo efficiente e recuperare gli oggetti impostati dalle tabelle hash. Tuttavia, i codici hash non identificano in modo univoco le stringhe. Le stringhe hanno codici hash uguali, ma il Common Language Runtime può assegnare lo stesso codice hash alle stringhe diverse. Inoltre, i codici hash possono variare dalla versione di .NET Framework, dalla piattaforma con una singola versione e dal dominio applicazione. Per questo motivo, non è necessario serializzare o mantenere i valori di codice hash, non è possibile utilizzarle come si digita una tabella hash o dizionario.

Per ulteriori informazioni sull'utilizzo dei codici hash e il metodo GetHashCode, consultare Object.GetHashCode.

Note per i chiamanti

Il valore restituito da GetHashCode dipende dalla piattaforma. Varia in base alle versioni a 32 bit e a 64 bit di .NET Framework. Può anche variare a seconda delle versioni di .NET Framework.

Nota di avvisoAttenzione

Un codice hash è adatto per l'inserimento e la ricerca di espressioni nelle raccolte basate su una tabella hash. Un codice hash non è un valore permanente. Per questo motivo:

  • Non devono essere serializzati i valori di codice hash e non devono essere memorizzati nei database.

  • Non deve essere utilizzato il codice hash come chiave per recuperare un oggetto da una raccolta con chiavi.

  • Non utilizzare il codice hash anziché un valore restituito da una funzione di crittografia di hashing. Per gli hash di crittografia, utilizzare la classe derivata dalla classe System.Security.Cryptography.KeyedHashAlgorithm o System.Security.Cryptography.HashAlgorithm.

  • Non si verifica l'uguaglianza dei codici hash per determinare se due oggetti sono uguali. (Oggetti diversi possono avere codici hash identici.) Per verificare l'uguaglianza, chiamare il metodo Equals o ReferenceEquals.

Nell'esempio riportato di seguito viene illustrato il metodo GetHashCode utilizzando diverse stringhe di input.


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

Supportato in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

.NET per applicazioni Windows Phone

Supportato in: 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 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft