Partilhar via


<UseRandomizedStringHashAlgorithm> Elemento

Determina se o runtime da linguagem comum calcula códigos hash para strings por domínio de aplicação.

<configuração>
   <tempo de execução>
     <UsarAlgoritmoHashStringRandomized>

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 obrigatório.

Especifica se os códigos de hash para strings são calculados por domínio de aplicação.

Atributo ativado

Valor Description
0 O runtime da linguagem comum não calcula códigos hash para strings por domínio de aplicação; Um único algoritmo é usado para calcular códigos de hash de cadeia. Este é o padrão.
1 O runtime da linguagem comum calcula códigos hash para cadeias de caracteres por domínio de aplicação. Strings idênticas em diferentes domínios de aplicação e processos diferentes terão códigos de hash diferentes.

Elementos Subordinados

Nenhum.

Elementos Principais

Elemento Description
configuration O elemento raiz em cada arquivo de configuração usado pelo Common Language Runtime e aplicativos .NET Framework.
runtime Contém informações sobre opções de inicialização de tempo de execução.

Observações

Por defeito, 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 aplicação. Isto é equivalente a definir o enabled atributo do <UseRandomizedStringHashAlgorithm> elemento para 0. Este é o algoritmo de hashing utilizado no .NET Framework 4.

A StringComparer classe e o String.GetHashCode método podem também usar um algoritmo de hash diferente que calcula códigos de hash por domínio de aplicação. Como resultado, os códigos de hash para cadeias equivalentes variarão entre domínios de aplicação. Esta é uma funcionalidade opt-in; para tirar partido disso, deve definir o enabled atributo do <UseRandomizedStringHashAlgorithm> elemento como 1.

A pesquisa de string numa tabela hash é tipicamente uma operação O(1). No entanto, quando ocorre um grande número de colisões, a consulta pode tornar-se numa operação O(n 2). Pode usar o <UseRandomizedStringHashAlgorithm> elemento de configuração para gerar um algoritmo de hash aleatório por domínio de aplicação, o que limita o número de colisões potenciais, especialmente quando as chaves a partir das quais os códigos de hash são calculados se baseiam em dados introduzidos pelos utilizadores.

Example

O exemplo seguinte define uma DisplayString classe que inclui uma constante de cadeia privada, s, cujo valor é "Esta é uma cadeia." Inclui também um ShowStringHashCode método que apresenta o valor da cadeia e o seu código de hash, juntamente com o nome do domínio de aplicação onde 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 '{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 executa o exemplo sem fornecer um ficheiro de configuração, ele apresenta uma saída semelhante à seguinte. Note-se que os códigos de hash da cadeia são idênticos nos dois domínios de 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 ficheiro de configuração seguinte ao diretório do exemplo e depois executar o exemplo, os códigos de hash para a mesma cadeia variarão consoante o domínio da aplicação.

<?xml version ="1.0"?>
<configuration>
   <runtime>
      <UseRandomizedStringHashAlgorithm enabled="1" />
   </runtime>
</configuration>

Quando o ficheiro de configuração está presente, o exemplo apresenta 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