Partager via


<UseRandomizedStringHashAlgorithm> Élément

Détermine si le Common Language Runtime calcule les codes de hachage pour les chaînes par domaine d’application.

<configuration>
   <Duree>
     <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.

Attributes

Caractéristique Descriptif
enabled Attribut obligatoire.

Spécifie si les codes de hachage pour les chaînes sont calculés par domaine d’application.

enabled Attribute

Valeur Descriptif
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 des chaînes par domaine d’application. Les chaînes identiques dans différents domaines d’application et dans différents processus auront des codes de hachage différents.

Éléments enfants

Aucun.

Éléments parents

Élément Descriptif
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.

Remarques

Par défaut, la StringComparer classe et la String.GetHashCode méthode 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 StringComparer classe et la String.GetHashCode méthode peuvent également utiliser un autre algorithme de hachage qui calcule les codes de hachage par domaine d’application. Par conséquent, les codes de hachage pour les chaînes équivalentes diffèrent entre les domaines d’application. Il s’agit d’une fonctionnalité d’adhésion ; pour en tirer parti, vous devez définir l’attribut enabled de l’élément <UseRandomizedStringHashAlgorithm> sur 1.

La recherche de chaînes 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 <UseRandomizedStringHashAlgorithm> de configuration 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 à partir desquelles les codes de hachage sont calculés sont basées sur l’entrée de données par les utilisateurs.

Example

L’exemple suivant définit une DisplayString classe qui inclut une constante de chaîne privée, sdont la valeur est « Il s’agit d’une chaîne ». Il inclut également une ShowStringHashCode méthode qui affiche la valeur de 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 '{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

Lorsque vous exécutez l’exemple sans fournir de fichier de configuration, il affiche une sortie similaire à ce qui suit. Notez que les codes de hachage de 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