Estoy tratando de entender cómo funcionan las Hashtables en C#. Leí el artículo de MSDN y entiendo que C# Hashtables usa 'rehashing' para colisiones, es decir, si intento insertar un par de clave/valor en la tabla hash, si usa HashFunction H1 da como resultado una colisión, entonces probará HashFunction H2, H3 , etc., hasta que no se encuentren colisiones.Reashing de colisión hashtable - ¿cómo se leen los valores?
MSDN cita:
La clase Hashtable utiliza una técnica diferente se refiere como rehasing. (Algunas fuentes se refieren a refrito como la doble dispersión.)
obras refrito de la siguiente manera: hay un conjunto de hash de diferentes funciones, H1 ... Hn, y al insertar o recuperar un elemento de la tabla hash, inicialmente se usa la función hash H1. Si esto lleva al a una colisión, se intenta H2 y en su lugar hasta Hn si es necesario. La sección anterior mostraba solo una función hash, que es la función hash inicial (H1). Las otras funciones hash son muy similares a esta función, solo diferenciando por un factor multiplicativo. En general, la función hash Hk se define como:
Hk (clave) = [GetHash (tecla) + k * (1 + (((GetHash (clave) >> 5) + 1)% (hashsize - 1)))]% hashsize
Sin embargo, tomando el ejemplo de la sitio1 MSDN:
private static Hashtable employees = new Hashtable();
public static void Main()
{
// Add some values to the Hashtable, indexed by a string key
employees.Add("111-22-3333", "Scott");
employees.Add("222-33-4444", "Sam");
}
vamos a suponer que la adición de la segunda clave resultará en una colisión, por lo H2 tendrá que ser usado. Sin embargo, cuando llamo a los empleados ["222-33-4444"], ¿cómo sabe la tabla hash usar H2? ¿Hay un mapeo separado? Gracias.
Si hace referencia a un enlace, debe incluirlo. –