Compartilhar via


<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  

Confira também