Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Determina se o common language runtime calcula códigos de hash para cadeias de caracteres por domínio de aplicativo.
<configuração>
<Runtime>
<UseRandomizedStringHashAlgorithm>
Sintaxe
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
Atributos e elementos
As seções a seguir descrevem atributos, elementos filho e elementos pai.
Attributes
| Attribute | Description |
|---|---|
enabled |
Atributo necessário. Especifica se os códigos de hash para cadeias de caracteres são calculados por domínio de aplicativo. |
Atributo habilitado
| Value | Description |
|---|---|
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 runtime 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 | Description |
|---|---|
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. |
Observações
Por padrão, a StringComparer classe e o String.GetHashCode método usam um único algoritmo de hash que produz um código hash consistente entre domínios de aplicativo. Isso é equivalente a definir o enabled atributo do <UseRandomizedStringHashAlgorithm> elemento como 0. Esse é o algoritmo de hash usado no .NET Framework 4.
A StringComparer classe e o String.GetHashCode método 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 domínios de aplicativo. Esse é um recurso de aceitação; para aproveitar isso, você deve definir o enabled atributo do <UseRandomizedStringHashAlgorithm> elemento 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 <UseRandomizedStringHashAlgorithm> elemento de configuração para gerar um algoritmo de hash aleatório por domínio de 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.
Example
O exemplo a seguir define uma DisplayString classe que inclui uma constante de cadeia de caracteres privada, scujo valor é "This is a string". Ele também inclui um ShowStringHashCode método que exibe o valor da cadeia de caracteres e seu código hash, juntamente 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 '{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
Quando você executa o exemplo sem fornecer um arquivo de configuração, ele exibe uma saída semelhante à seguinte. Observe que os códigos de 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
No entanto, se você adicionar o arquivo de configuração a seguir ao diretório do exemplo e, em seguida, executar o exemplo, os códigos de hash para a mesma cadeia de caracteres serão diferentes pelo domínio do aplicativo.
<?xml version ="1.0"?>
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm enabled="1" />
</runtime>
</configuration>
Quando o arquivo de configuração está presente, o exemplo exibe a seguinte saída:
String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236