Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Determina se Common Language Runtime calcola i codici hash per le stringhe in base al dominio dell'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.
Attributes
| Attribute | Description |
|---|---|
enabled |
Attributo obbligatorio. Specifica se i codici hash per le stringhe vengono calcolati in base al dominio dell'applicazione. |
Attributo abilitato
| Value | Description |
|---|---|
0 |
Common Language Runtime non calcola i codici hash per le stringhe per ogni dominio dell'applicazione; viene usato un singolo algoritmo per calcolare i codici hash stringa. Si tratta dell'impostazione predefinita. |
1 |
Common Language Runtime calcola i codici hash per le stringhe in base al dominio dell'applicazione. Stringhe identiche in domini applicazione diversi e in processi diversi avranno codici hash diversi. |
Elementi figli
Nessuno.
Elementi padre
| Elemento | Description |
|---|---|
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. |
Osservazioni:
Per impostazione predefinita, la StringComparer classe e il String.GetHashCode metodo usano un singolo algoritmo hash che produce un codice hash coerente nei 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 dell'applicazione. Di conseguenza, i codici hash per le stringhe equivalenti differiscono tra i domini applicazione. Si tratta di una funzionalità di consenso esplicito; per sfruttarne i vantaggi, è 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.
Example
Nell'esempio seguente viene definita 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 '{s}' in domain '{AppDomain.CurrentDomain.FriendlyName}': {s.GetHashCode():X8}");
}
}
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 specificare un file di configurazione, viene visualizzato un output simile 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 dell'esempio e quindi si esegue l'esempio, i codici hash per la stessa stringa differiscono in base al dominio applicazione.
<?xml version ="1.0"?>
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm enabled="1" />
</runtime>
</configuration>
Quando il file di configurazione è presente, nell'esempio viene visualizzato l'output seguente:
String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236