Delen via


<Het element UseRandomizedStringHashAlgorithm>

Bepaalt of de runtime van de algemene taal hash-codes voor tekenreeksen berekent op basis van een toepassingsdomein.

<configuratie>
  <Runtime>
    <UseRandomizedStringHashAlgorithm>

Syntax

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

Kenmerken en elementen

In de volgende secties worden kenmerken, onderliggende elementen en bovenliggende elementen beschreven.

Kenmerken

Kenmerk Beschrijving
enabled Vereist kenmerk.

Hiermee geeft u op of hash-codes voor tekenreeksen worden berekend op basis van een toepassingsdomein.

ingeschakeld kenmerk

Waarde Beschrijving
0 De common language runtime berekent geen hash-codes voor tekenreeksen op basis van een toepassingsdomein; er wordt één algoritme gebruikt om hashcodes voor tekenreeksen te berekenen. Dit is de standaardinstelling.
1 De common language runtime berekent hashcodes voor tekenreeksen op basis van een toepassingsdomein. Identieke tekenreeksen in verschillende toepassingsdomeinen en in verschillende processen hebben verschillende hashcodes.

Onderliggende elementen

Geen.

Bovenliggende elementen

Element Beschrijving
configuration Het hoofdelement in elk configuratiebestand dat wordt gebruikt door de common language runtime en .NET Framework toepassingen.
runtime Bevat informatie over opties voor runtime-initialisatie.

Opmerkingen

Standaard maken de StringComparer klasse en de String.GetHashCode methode gebruik van één hash-algoritme dat een consistente hashcode produceert in toepassingsdomeinen. Dit komt overeen met het instellen van het enabled kenmerk van het <UseRandomizedStringHashAlgorithm> element op 0. Dit is het hash-algoritme dat wordt gebruikt in de .NET Framework 4.

De StringComparer klasse en de String.GetHashCode methode kunnen ook een ander hash-algoritme gebruiken waarmee hashcodes per toepassingsdomein worden berekend. Als gevolg hiervan verschillen hash-codes voor equivalente tekenreeksen tussen toepassingsdomeinen. Dit is een opt-in-functie; Als u hiervan wilt profiteren, moet u het enabled kenmerk van het <UseRandomizedStringHashAlgorithm> -element instellen op 1.

Het opzoeken van tekenreeksen in een hashtabel is doorgaans een O(1)-bewerking. Wanneer er echter een groot aantal conflicten optreedt, kan het opzoeken een O(n2)-bewerking worden. U kunt het <UseRandomizedStringHashAlgorithm> configuratie-element gebruiken om een willekeurig hashing-algoritme per toepassingsdomein te genereren, waardoor het aantal mogelijke conflicten wordt beperkt, met name wanneer de sleutels waaruit de hash-codes worden berekend, zijn gebaseerd op gegevensinvoer door gebruikers.

Voorbeeld

In het volgende voorbeeld wordt een DisplayString klasse gedefinieerd die een persoonlijke tekenreeksconstante bevat, s, waarvan de waarde 'Dit is een tekenreeks' is. Het bevat ook een ShowStringHashCode methode waarmee de tekenreekswaarde en de hashcode worden weergegeven, samen met de naam van het toepassingsdomein waarin de methode wordt uitgevoerd.

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

Wanneer u het voorbeeld uitvoert zonder een configuratiebestand op te geven, wordt uitvoer weergegeven die er ongeveer als volgt uitziet. Houd er rekening mee dat de hashcodes voor de tekenreeks identiek zijn in de twee toepassingsdomeinen.

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

Als u echter het volgende configuratiebestand toevoegt aan de map van het voorbeeld en vervolgens het voorbeeld uitvoert, verschillen de hash-codes voor dezelfde tekenreeks per toepassingsdomein.

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

Wanneer het configuratiebestand aanwezig is, wordt in het voorbeeld de volgende uitvoer weergegeven:

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

Zie ook