<UseRandomizedStringHashAlgorithm >-Element<UseRandomizedStringHashAlgorithm> Element

Bestimmt, ob die Common Language Runtime Hashcodes für Zeichenfolgen pro Anwendungsdomäne berechnet.Determines whether the common language runtime calculates hash codes for strings on a per application domain basis.

<configuration><configuration>
<runtime><runtime>
<UseRandomizedStringHashAlgorithm><UseRandomizedStringHashAlgorithm>

SyntaxSyntax

<UseRandomizedStringHashAlgorithm   
   enabled=0|1 />  

Attribute und ElementeAttributes and Elements

In den folgenden Abschnitten werden Attribute sowie untergeordnete und übergeordnete Elemente beschrieben.The following sections describe attributes, child elements, and parent elements.

AttributeAttributes

AttributAttribute BeschreibungDescription
enabled Erforderliches Attribut.Required attribute.

Gibt an, ob Hashcodes für Zeichenfolgen pro Anwendungsdomäne berechnet werden.Specifies whether hash codes for strings are calculated on a per application domain basis.

Enabled-Attributenabled Attribute

WertValue BeschreibungDescription
0 Die Common Language Runtime berechnet Hashcodes für Zeichenfolgen nicht pro Anwendungsdomäne; es wird ein einzelner Algorithmus verwendet, um Hashcodes für Zeichenfolgen zu berechnen.The common language runtime does not compute hash codes for strings on a per application domain basis; a single algorithm is used to calculate string hash codes. Dies ist die Standardeinstellung.This is the default.
1 Die Common Language Runtime berechnet Hashcodes für Zeichenfolgen pro Anwendungsdomäne.The common language runtime computes hash codes for strings on a per application domain basis. Identische Zeichenfolgen in unterschiedlichen Anwendungsdomänen und in verschiedenen Prozessen weisen unterschiedliche Hashcodes auf.Identical strings in different application domains and in different processes will have different hash codes.

Untergeordnete ElementeChild Elements

KeineNone.

Übergeordnete ElementeParent Elements

ElementElement BeschreibungDescription
configuration Das Stammelement in jeder von den Common Language Runtime- und .NET Framework-Anwendungen verwendeten Konfigurationsdatei.The root element in every configuration file used by the common language runtime and .NET Framework applications.
runtime Enthält Informationen über Laufzeitinitialisierungsoptionen.Contains information about runtime initialization options.

HinweiseRemarks

Standardmäßig verwenden die StringComparer-Klasse und die String.GetHashCode-Methode einen einzelnen Hashalgorithmus, der einen über verschiedene Anwendungsdomänen hinweg konsistenten Hashcode erzeugt.By default, the StringComparer class and the String.GetHashCode method use a single hashing algorithm that produces a consistent hash code across application domains. Dies entspricht dem Festlegen des enabled-Attributs des <UseRandomizedStringHashAlgorithm>-Elements auf 0.This is equivalent to setting the enabled attribute of the <UseRandomizedStringHashAlgorithm> element to 0. Dies ist der Hashalgorithmus, der in .NET Framework 4 verwendet.This is the hashing algorithm used in the .NET Framework 4.

Die StringComparer-Klasse und die String.GetHashCode-Methode können auch einen anderen Hashalgorithmus verwenden, der Hashcodes pro Anwendungsdomäne berechnet.The StringComparer class and the String.GetHashCode method can also use a different hashing algorithm that computes hash codes on a per application domain basis. Dadurch variieren Hashcodes für identische Zeichenfolgen von Anwendungsdomäne zu Anwendungsdomäne.As a result, hash codes for equivalent strings will differ across application domains. Dies ist eine Opt-In-Funktion; um sie zu nutzen, müssen Sie das enabled-Attribut des <UseRandomizedStringHashAlgorithm>-Elements auf 1 festlegen.This is an opt-in feature; to take advantage of it, you must set the enabled attribute of the <UseRandomizedStringHashAlgorithm> element to 1.

Die Zeichenfolgensuche in einer Hashtabelle ist in der Regel eine O(1)-Operation.The string lookup in a hash table is typically an O(1) operation. Aber wenn eine große Anzahl von Konflikten auftreten, die Suche kann auch eine o (n2) Vorgang.However, when a large number of collisions occur, the lookup can become an O(n2) operation. Sie können das <UseRandomizedStringHashAlgorithm>-Konfigurationselement verwenden, um einen zufälligen Hashalgorithmus pro Anwendungsdomäne zu generieren. Dadurch wird die Anzahl der potenziellen Konflikte beschränkt, insbesondere wenn die Schlüssel, aus denen die Hashcodes berechnet werden, auf Dateneingaben durch Benutzer basieren.You can use the <UseRandomizedStringHashAlgorithm> configuration element to generate a random hashing algorithm per application domain, which in turn limits the number of potential collisions, particularly when the keys from which the hash codes are calculated are based on data input by users.

BeispielExample

Im folgenden Beispiel wird eine DisplayString-Klasse definiert, die die private Zeichenfolgenkonstante s enthält, deren Wert "Dies ist eine Zeichenfolge" lautet.The following example defines a DisplayString class that includes a private string constant, s, whose value is "This is a string." Außerdem enthält sie eine ShowStringHashCode-Methode, die den Zeichenfolgenwert und dessen Hashcode zusammen mit dem Namen der Anwendungsdomäne anzeigt, in der die Methode ausgeführt wird.It also includes a ShowStringHashCode method that displays the string value and its hash code along with the name of the application domain in which the method is executing.

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

Wenn Sie das Beispiel ausführen, ohne eine Konfigurationsdatei anzugeben, wird die folgende Ausgabe angezeigt.When you run the example without supplying a configuration file, it displays output similar to the following. Beachten Sie, dass die Hashcodes für die Zeichenfolge in den zwei Anwendungsdomänen identisch sind.Note that the hash codes for the string are identical in the two application domains.

String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC  
String 'This is a string.' in domain 'NewDomain': 941BCEAC  

Wenn Sie jedoch die folgende Konfigurationsdatei im Verzeichnis des Beispiels hinzufügen und dann das Beispiel ausführen, unterscheiden sich die Hashcodes je nach Anwendungsdomäne.However, if you add the following configuration file to the example's directory and then run the example, the hash codes for the same string will differ by application domain.

<?xml version ="1.0"?>  
<configuration>  
   <runtime>  
      <UseRandomizedStringHashAlgorithm enabled="1" />  
   </runtime>  
</configuration>  

Wenn die Konfigurationsdatei vorhanden ist, zeigt das Beispiel die folgende Ausgabe an:When the configuration file is present, the example displays the following output:

String 'This is a string.' in domain 'PerDomain.exe': 5435776D  
String 'This is a string.' in domain 'NewDomain': 75CC8236  

Siehe auchSee also