Elemento <UseRandomizedStringHashAlgorithm>

Determina si el Common Language Runtime calcula los códigos hash de las cadenas por cada dominio de aplicación.

<configuration>
  <runtime>
    <UseRandomizedStringHashAlgorithm>

Sintaxis

<UseRandomizedStringHashAlgorithm
   enabled=0|1 />  

Atributos y elementos

En las siguientes secciones se describen los atributos, los elementos secundarios y los elementos primarios.

Atributos

Atributo Descripción
enabled Atributo necesario.

Especifica si los códigos hash de las cadenas se calculan por cada dominio de aplicación.

Atributo enabled

Valor Descripción
0 Common Language Runtime no procesa códigos hash para cadenas por dominio de aplicación; se usa un único algoritmo para calcular códigos hash de cadena. Este es el valor predeterminado.
1 Common Language Runtime procesa los códigos hash de las cadenas por cada dominio de aplicación. Las cadenas idénticas en distintos dominios de aplicación y en procesos diferentes tendrán códigos hash diferentes.

Elementos secundarios

Ninguno.

Elementos primarios

Elemento Descripción
configuration Elemento raíz de cada archivo de configuración usado por las aplicaciones de Common Language Runtime y .NET Framework.
runtime Contiene información sobre las opciones de inicialización del motor en tiempo de ejecución.

Comentarios

De forma predeterminada, la clase StringComparer y el método String.GetHashCode usan un único algoritmo hash que genera un código hash coherente entre dominios de aplicación. Esto equivale a establecer el atributo enabled del elemento <UseRandomizedStringHashAlgorithm> en 0. Este es el algoritmo hash que se usa en .NET Framework 4.

La clase StringComparer y el método String.GetHashCode también pueden usar un algoritmo hash diferente que calcula los códigos hash por dominio de aplicación. Como resultado, los códigos hash de las cadenas equivalentes variarán entre los dominios de aplicación. Se trata de una característica de participación; para aprovecharla, debe establecer el atributo enabled del elemento <UseRandomizedStringHashAlgorithm> en 1.

La búsqueda de cadenas en una tabla hash suele ser una operación O(1). Pero cuando se produce un gran número de colisiones, la búsqueda puede convertirse en una operación O(n2). Puede usar el elemento de configuración <UseRandomizedStringHashAlgorithm> para generar un algoritmo hash aleatorio por dominio de aplicación, que a su vez limita el número de posibles colisiones, especialmente cuando las claves desde las que se calculan los códigos hash se basan en la entrada de datos por parte de los usuarios.

Ejemplo

En el ejemplo siguiente se define una clase DisplayString que incluye una constante de cadena privada, s, cuyo valor es "This is a string". También incluye un método ShowStringHashCode que muestra el valor de cadena y su código hash junto con el nombre del dominio de aplicación en el que se ejecuta el método.

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

Cuando ejecute el ejemplo sin proporcionar un archivo de configuración, mostrará un resultado similar al siguiente. Observe que los códigos hash de la cadena son idénticos en los dos dominios de aplicación.

String 'This is a string.' in domain 'PerDomain.exe': 941BCEAC  
String 'This is a string.' in domain 'NewDomain': 941BCEAC  

Sin embargo, si agrega el archivo de configuración siguiente al directorio de ejemplo y, a continuación, ejecuta el ejemplo, los códigos hash para la misma cadena diferirán en función del dominio de aplicación.

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

Cuando el archivo de configuración está presente, el ejemplo muestra el siguiente resultado:

String 'This is a string.' in domain 'PerDomain.exe': 5435776D  
String 'This is a string.' in domain 'NewDomain': 75CC8236  

Consulte también