<UseRandomizedStringHashAlgorithm>, élément
Détermine si le Common Language Runtime calcule les codes de hachage des chaînes par domaine d’application.
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm>
Syntaxe
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
Attributs et éléments
Les sections suivantes décrivent des attributs, des éléments enfants et des éléments parents.
Attributs
Attribut | Description |
---|---|
enabled |
Attribut requis. Spécifie si les codes de hachage pour les chaînes sont calculés par domaine d’application. |
Attribut enabled
Valeur | Description |
---|---|
0 |
Le Common Language Runtime ne calcule pas les codes de hachage pour les chaînes par domaine d’application. Un algorithme unique est utilisé pour calculer les codes de hachage de chaîne. Il s’agit de la valeur par défaut. |
1 |
Le Common Language Runtime calcule les codes de hachage pour les chaînes par domaine d’application. Des chaînes identiques dans différents domaines d’application et dans différents processus auront des codes de hachage différents. |
Éléments enfants
Aucune.
Éléments parents
Élément | Description |
---|---|
configuration |
Élément racine de chaque fichier de configuration utilisé par le Common Language Runtime et les applications .NET Framework. |
runtime |
Contient des informations sur les options d'initialisation du runtime. |
Notes
Par défaut, la classe StringComparer et la méthode String.GetHashCode utilisent un algorithme de hachage unique qui produit un code de hachage cohérent entre les domaines d’application. Cela équivaut à définir l’attribut enabled
de l’élément <UseRandomizedStringHashAlgorithm>
sur 0
. Il s’agit de l’algorithme de hachage utilisé dans .NET Framework 4.
La classe StringComparer et la méthode String.GetHashCode peuvent également utiliser un algorithme de hachage différent qui calcule les codes de hachage par domaine d’application. Par conséquent, les codes de hachage pour des chaînes équivalentes différeront entre les domaines d’application. Il s’agit d’une fonctionnalité nécessitant une acceptation. Pour en bénéficier, vous devez définir l’attribut enabled
de l’élément <UseRandomizedStringHashAlgorithm>
sur 1
.
La recherche de chaîne dans une table de hachage est généralement une opération O(1). Toutefois, lorsqu’un grand nombre de collisions se produisent, la recherche peut devenir une opération O(n2). Vous pouvez utiliser l’élément de configuration <UseRandomizedStringHashAlgorithm>
pour générer un algorithme de hachage aléatoire par domaine d’application, qui limite à son tour le nombre de collisions potentielles, en particulier lorsque les clés provenant des codes de hachage sont calculées en fonction de l’entrée de données par les utilisateurs.
Exemple
L’exemple suivant définit une classe DisplayString
qui inclut une constante de chaîne privée, s
, dont la valeur est « Ceci est une chaîne ». Il inclut également une méthode ShowStringHashCode
qui affiche la valeur de la chaîne et son code de hachage, ainsi que le nom du domaine d’application dans lequel la méthode s’exécute.
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
Lorsque vous exécutez l'exemple sans fournir un fichier de configuration, il affiche une sortie similaire à la suivante. Notez que les codes de hachage pour la chaîne sont identiques dans les deux domaines d'application.
String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC
String 'This is a string.' in domain 'NewDomain': 941BCEAC
Toutefois, si vous ajoutez le fichier de configuration suivant au répertoire de l'exemple, puis exécutez l'exemple, les codes de hachage pour la même chaîne diffèrent par domaine d'application.
<?xml version ="1.0"?>
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm enabled="1" />
</runtime>
</configuration>
Lorsque le fichier de configuration est présent, l'exemple affiche la sortie suivante :
String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236