<UseRandomizedStringHashAlgorithm Element (Elemento UseRandomizedStringHashAlgorithm> )
Determina se o runtime de linguagem comum calcula códigos hash para cadeias numa base de domínio por aplicação.
<configuração>
<runtime>
<UseRandomizedStringHashAlgorithm>
Syntax
<UseRandomizedStringHashAlgorithm
enabled=0|1 />
Atributos e Elementos
As secções seguintes descrevem atributos, elementos subordinados e elementos principais.
Atributos
Atributo | Descrição |
---|---|
enabled |
Atributo obrigatório. Especifica se os códigos hash para cadeias são calculados numa base de domínio por aplicação. |
Atributo ativado
Valor | Descrição |
---|---|
0 |
O runtime de linguagem comum não computa códigos hash para cadeias numa base de domínio por aplicação; um único algoritmo é utilizado para calcular códigos hash de cadeia. Esta é a predefinição. |
1 |
O runtime de linguagem comum calcula códigos hash para cadeias numa base de domínio por aplicação. Cadeias idênticas em domínios de aplicações diferentes e em processos diferentes terão códigos hash diferentes. |
Elementos Subordinados
Nenhum.
Elementos Principais
Elemento | Descrição |
---|---|
configuration |
O elemento raiz em todos os ficheiros de configuração utilizados pelo runtime de idioma comum e .NET Framework aplicações. |
runtime |
Contém informações sobre as opções de inicialização do runtime. |
Observações
Por predefinição, a StringComparer classe e o String.GetHashCode método utilizam um único algoritmo hash que produz um código hash consistente em todos os domínios da aplicação. Isto é equivalente a definir o enabled
atributo do <UseRandomizedStringHashAlgorithm>
elemento como 0
. Este é o algoritmo hashing utilizado no .NET Framework 4.
A StringComparer classe e o String.GetHashCode método também podem utilizar um algoritmo hash diferente que computa códigos hash numa base de domínio por aplicação. Como resultado, os códigos hash para cadeias equivalentes serão diferentes entre os domínios da aplicação. Esta é uma funcionalidade de opt-in; para tirar partido do mesmo, tem de definir o enabled
atributo do <UseRandomizedStringHashAlgorithm>
elemento como 1
.
Normalmente, a pesquisa de cadeias numa tabela hash é uma operação O(1). No entanto, quando ocorre um grande número de colisões, a pesquisa pode tornar-se numa operação O(n2). Pode utilizar o <UseRandomizedStringHashAlgorithm>
elemento de configuração para gerar um algoritmo hash aleatório por domínio de aplicação, o que, por sua vez, limita o número de potenciais colisões, especialmente quando as chaves a partir das quais os códigos hash são calculados se baseiam na entrada de dados por parte dos utilizadores.
Exemplo
O exemplo seguinte define uma DisplayString
classe que inclui uma constante de cadeia privada, , s
cujo valor é "Isto é uma cadeia". Também inclui um ShowStringHashCode
método que apresenta o valor da cadeia e o respetivo código hash, juntamente com o nome do domínio da aplicação no qual o método está a ser 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 executa o exemplo sem fornecer um ficheiro de configuração, este apresenta um resultado semelhante ao seguinte. Tenha em atenção que os códigos hash da cadeia são idênticos nos dois domínios da aplicação.
String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC
String 'This is a string.' in domain 'NewDomain': 941BCEAC
No entanto, se adicionar o seguinte ficheiro de configuração ao diretório do exemplo e, em seguida, executar o exemplo, os códigos hash para a mesma cadeia de carateres serão diferentes pelo domínio da aplicação.
<?xml version ="1.0"?>
<configuration>
<runtime>
<UseRandomizedStringHashAlgorithm enabled="1" />
</runtime>
</configuration>
Quando o ficheiro de configuração estiver presente, o exemplo apresenta o seguinte resultado:
String 'This is a string.' in domain 'PerDomain.exe': 5435776D
String 'This is a string.' in domain 'NewDomain': 75CC8236