<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, , s
vars 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