<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  

Voir aussi