Dela via


<UseRandomizedStringHashAlgorithm-element>

Avgör om den vanliga språkkörningen beräknar hash-koder 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.

Attribut

Attribut Beskrivning
enabled Obligatoriskt attribut.

Anger om hashkoder för strängar beräknas per programdomän.

aktiverat attribut

Värde Beskrivning
0 Den vanliga språkkörningen beräknar inte hash-koder 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 Den vanliga språkkörningen 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

Inga.

Överordnade element

Element Beskrivning
configuration Rotelementet i varje konfigurationsfil som används av common language runtime och .NET Framework program.
runtime Innehåller information om initieringsalternativ för körning.

Kommentarer

Som standard StringComparer använder klassen och String.GetHashCode metoden en enda hash-algoritm som skapar 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 hashkoder för motsvarande strängar mellan programdomäner. Det här är en opt-in-funktion. om du vill 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 <UseRandomizedStringHashAlgorithm> konfigurationselementet 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ändare.

Exempel

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å den programdomän 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 '{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

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 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