<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, , scujo 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  

Ver também