<UseRandomizedStringHashAlgorithm> Element

Avgör om den vanliga språkkörningen beräknar hashkoder för strängar per programdomän.

<konfiguration>
   <Runtime>
     <UseRandomizedStringHashAlgorithm>

Syntax

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />

Attribut och element

I följande avsnitt beskrivs attribut, underordnade element och överordnade element.

Attributes

Attribute Description
enabled Obligatoriskt attribut.

Anger om hash-koder för strängar beräknas per programdomän.

aktiverat attribut

Värde Description
0 Den vanliga språkkörningen beräknar inte hashkoder för strängar per programdomän. en enda algoritm används för att beräkna stränghashkoder. Det här är standardinställningen.
1 Common Language Runtime beräknar hashkoder för strängar per programdomän. Identiska strängar i olika programdomäner och i olika processer har olika hash-koder.

Underordnade element

Ingen.

Överordnade element

Komponent Description
configuration Rotelementet i varje konfigurationsfil som används av vanliga språkkörnings- och .NET Framework-program.
runtime Innehåller information om initieringsalternativ för körning.

Anmärkningar

Som standard StringComparer använder klassen och String.GetHashCode metoden en enda hashalgoritm som genererar en konsekvent hash-kod mellan programdomäner. Detta motsvarar att ange enabled attributet för elementet <UseRandomizedStringHashAlgorithm> till 0. Det här är hash-algoritmen som används i .NET Framework 4.

Klassen StringComparer och String.GetHashCode metoden kan också använda en annan hashalgoritm som beräknar hashkoder per programdomän. Därför skiljer sig hash-koder för motsvarande strängar mellan programdomäner. Det här är en opt-in-funktion. för att dra nytta av det måste du ange enabled -attributet för elementet <UseRandomizedStringHashAlgorithm> till 1.

Strängsökningen i en hash-tabell är vanligtvis en O(1)-åtgärd. Men när ett stort antal kollisioner inträffar kan sökningen bli en O(n2)-åtgärd. Du kan använda konfigurationselementet <UseRandomizedStringHashAlgorithm> för att generera en slumpmässig hashalgoritm per programdomän, vilket i sin tur begränsar antalet potentiella kollisioner, särskilt när nycklarna som hashkoderna beräknas från baseras på dataindata från användarna.

Example

I följande exempel definieras en DisplayString klass som innehåller en privat strängkonstant, , svars värde är "Det här är en sträng". Den innehåller också en ShowStringHashCode metod som visar strängvärdet och dess hash-kod tillsammans med namnet på programdomänen där metoden körs.

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

När du kör exemplet utan att ange en konfigurationsfil visas utdata som liknar följande. Observera att hash-koderna för strängen är identiska i de två programdomänerna.

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

Men om du lägger till följande konfigurationsfil i exemplets katalog och sedan kör exemplet, skiljer sig hash-koderna för samma sträng efter programdomän.

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

När konfigurationsfilen finns visar exemplet följande utdata:

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

Se även