<Elemento UseRandomizedStringHashAlgorithm>

Determina se Common Language Runtime calcola i codici hash per le stringhe in base al dominio applicazione.

<Configurazione>
  <Runtime>
    <UseRandomizedStringHashAlgorithm>

Sintassi

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

Attributi ed elementi

Nelle sezioni seguenti vengono descritti gli attributi, gli elementi figlio e gli elementi padre.

Attributi

Attributo Descrizione
enabled Attributo obbligatorio.

Specifica se i codici hash per le stringhe vengono calcolati per ogni dominio applicazione.

Attributo enabled

Valore Descrizione
0 Common Language Runtime non calcola i codici hash per le stringhe in base al dominio dell'applicazione; viene usato un singolo algoritmo per calcolare i codici hash stringa. Questo è il valore predefinito.
1 Common Language Runtime calcola i codici hash per le stringhe per ogni dominio applicazione. Le stringhe identiche in domini applicazione diversi e in processi diversi avranno codici hash diversi.

Elementi figlio

Nessuno.

Elementi padre

Elemento Descrizione
configuration Elemento radice in ciascun file di configurazione usato in Common Language Runtime e nelle applicazioni .NET Framework.
runtime Contiene informazioni sulle opzioni di inizializzazione in fase di esecuzione.

Commenti

Per impostazione predefinita, la StringComparer classe e il String.GetHashCode metodo usano un singolo algoritmo hash che produce un codice hash coerente tra domini applicazione. Equivale a impostare l'attributo enabled dell'elemento <UseRandomizedStringHashAlgorithm> su 0. Si tratta dell'algoritmo hash usato in .NET Framework 4.

La StringComparer classe e il String.GetHashCode metodo possono anche usare un algoritmo hash diverso che calcola i codici hash per ogni dominio applicazione. Di conseguenza, i codici hash per stringhe equivalenti differiscono tra i domini applicazione. Si tratta di una funzionalità di consenso esplicito; per sfruttarlo, è necessario impostare l'attributo enabled dell'elemento <UseRandomizedStringHashAlgorithm> su 1.

La ricerca di stringhe in una tabella hash è in genere un'operazione O(1). Tuttavia, quando si verifica un numero elevato di collisioni, la ricerca può diventare un'operazione O(n2). È possibile usare l'elemento <UseRandomizedStringHashAlgorithm> di configurazione per generare un algoritmo hash casuale per ogni dominio applicazione, che a sua volta limita il numero di potenziali conflitti, in particolare quando le chiavi da cui vengono calcolati i codici hash sono basate sull'input dei dati da parte degli utenti.

Esempio

L'esempio seguente definisce una DisplayString classe che include una costante stringa privata, s, il cui valore è "This is a string". Include anche un ShowStringHashCode metodo che visualizza il valore stringa e il relativo codice hash insieme al nome del dominio applicazione in cui viene eseguito il metodo.

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());
   }
}
Module Example
    Public Sub Main()
        ' Show hash code in current domain.
        Dim display As New DisplayString()
        display.ShowStringHashCode()

        ' Create a new app domain and show string hash code.
        Dim domain As AppDomain = AppDomain.CreateDomain("NewDomain")
        Dim display2 = CType(domain.CreateInstanceAndUnwrap(GetType(Example).Assembly.FullName,
                                                            "DisplayString"), DisplayString)
        display2.ShowStringHashCode()
    End Sub
End Module

Public Class DisplayString : Inherits MarshalByRefObject

    Private s As String = "This is a string."

    Public Overrides Function Equals(obj As Object) As Boolean
        Dim s2 As String = TryCast(obj, String)
        If s2 Is Nothing Then
            Return False
        Else
            Return s = s2
        End If
    End Function

    Public Overloads Function Equals(str As String) As Boolean
        Return s = str
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return s.GetHashCode()
    End Function

    Public Overrides Function ToString() As String
        Return s
    End Function

    Public Sub ShowStringHashCode()
        Console.WriteLine("String '{0}' in domain '{1}': {2:X8}",
                          s, AppDomain.CurrentDomain.FriendlyName,
                          s.GetHashCode())
    End Sub
End Class

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  

Vedi anche