<Elemento UseRandomizedStringHashAlgorithm>
Determina se o Common Language Runtime calcula códigos hash para sequências com base no domínio do aplicativo.
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm>
Syntax
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
Atributos e elementos
As seções a seguir descrevem atributos, elementos filho e elementos pai.
Atributos
Atributo | Descrição |
---|---|
enabled |
Atributo obrigatório. Especifica se os códigos hash de cadeias de caracteres são calculados de acordo com o domínio do aplicativo. |
Atributo habilitado
Valor | Descrição |
---|---|
0 |
O Common Language Runtime não computa códigos de hash para cadeias de caracteres por domínio de aplicativo; um único algoritmo é usado para calcular códigos de hash de cadeia de caracteres. Esse é o padrão. |
1 |
O Common Language Runtimee calcula códigos de hash para cadeias de caracteres por domínio de aplicativo. Cadeias de caracteres idênticas em diferentes domínios de aplicativo e em processos diferentes terão códigos de hash diferentes. |
Elementos filho
Nenhum.
Elementos pai
Elemento | Descrição |
---|---|
configuration |
O elemento raiz em cada arquivo de configuração usado pelos aplicativos do Common Language Runtime e .NET Framework. |
runtime |
Contém informações sobre opções de inicialização do runtime. |
Comentários
Por padrão, a classe StringComparer e o método String.GetHashCode usam um único algoritmo de hash que produz um código hash consistente entre domínios de aplicativo. Isso é equivalente a definir o atributo enabled
do elemento <UseRandomizedStringHashAlgorithm>
como 0
. Esse é o algoritmo de hash usado no .NET Framework 4.
A classe StringComparer e o método String.GetHashCode também podem usar um algoritmo de hash diferente que computa códigos de hash por domínio de aplicativo. Como resultado, os códigos de hash para cadeias de caracteres equivalentes serão diferentes entre os domínios do aplicativo. Esse é um recurso de aceitação. Para tirar proveito dele, você precisa definir o atributo enabled
do elemento <UseRandomizedStringHashAlgorithm>
como 1
.
A pesquisa de cadeia de caracteres em uma tabela de hash normalmente é uma operação O(1). No entanto, quando ocorre um grande número de colisões, a pesquisa pode se tornar uma operação O(n2). Você pode usar o elemento de configuração <UseRandomizedStringHashAlgorithm>
para gerar um algoritmo de hash aleatório por domínio do aplicativo, o que, por sua vez, limita o número de possíveis colisões, especialmente quando as chaves das quais os códigos de hash são calculados são baseadas na entrada de dados pelos usuários.
Exemplo
O exemplo a seguir define uma classe DisplayString
que inclui uma constante de cadeia de caracteres privada, s
, cujo valor é "Esta é uma cadeia de caracteres". Ele também inclui um método ShowStringHashCode
que exibe o valor da cadeia de caracteres e o código hash com o nome do domínio do aplicativo no qual o método está sendo executado.
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
Quando você executa o exemplo sem fornecer um arquivo de configuração, ele exibe uma saída semelhante à seguinte. Observe que os códigos hash para a cadeia de caracteres são idênticos nos dois domínios de aplicativo.
String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC
String 'This is a string.' in domain 'NewDomain': 941BCEAC
Entretanto, se você adicionar o seguinte arquivo de configuração ao diretório de exemplo e, então, executar o exemplo, os códigos hash da mesma cadeia de caracteres diferirão de acordo com o domínio de aplicativo.
<?xml version ="1.0"?>
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm enabled="1" />
</runtime>
</configuration>
Quando o arquivo de configuração estiver presente, o exemplo exibe a saída a seguir:
String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236