Compartilhar via


<UseRandomizedStringHashAlgorithm> Elemento

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

Consulte também