Tipos de las colecciones Hashtable y Dictionary

La clase System.Collections.Hashtable y las clases genéricas System.Collections.Generic.Dictionary<TKey, TValue> y System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue> implementan la interfaz System.Collections.IDictionary. La clase genérica Dictionary<TKey, TValue> también implementa la interfaz genérica IDictionary<TKey, TValue>. Por consiguiente, todos los elementos de estas colecciones son un par de clave y valor.

Un objeto Hashtable está formado por sectores que contienen los elementos de la colección. Un sector de almacenamiento es un subgrupo virtual de elementos dentro de la Hashtable con el que se consigue facilitar y agilizar la búsqueda y la recuperación con respecto a la mayoría de las colecciones. Cada depósito está asociado a un código hash, que se genera usando una función hash y se basa en la clave del elemento.

La clase genérica HashSet<T> es una colección desordenada de elementos únicos. Para obtener más información sobre esta colección, vea Tipo de colección HashSet.

Una función hash es un algoritmo que devuelve un código hash numérico en función de una clave. La clave es el valor de alguna propiedad del objeto que se almacena. Una función hash siempre debe devolver el mismo código hash para la misma clave. Una función hash puede generar el mismo código hash para dos claves diferentes, pero una función hash que genera un código hash único para cada clave única tiene mejor rendimiento al recuperar los elementos de la tabla hash.

Cada objeto usado como elemento en una Hashtable debe poder generar un código hash para sí mismo mediante una implementación del método GetHashCode. Aun así, también puede especificarse una función hash para todos los elementos en Hashtable mediante un constructor de Hashtable que acepte como parámetro una implementación de IHashCodeProvider.

Cuando se agrega un objeto a Hashtable, éste pasa al sector de almacenamiento asociado al código hash que coincide con el suyo propio. Cuando se busca un valor en Hashtable, se genera el código hash para ese valor y se busca el sector de almacenamiento asociado al código.

Por ejemplo, una función hash de una cadena puede aceptar los códigos ASCII de cada carácter de la cadena y sumarlos todos para generar un código hash. La cadena "picnic" tendría un código hash distinto al de la cadena "cesta"; por lo tanto, las cadenas "picnic" y "cesta" estarían en distintos sectores de almacenamiento. Por otro lado, "gato" y "toga" tendrían el mismo código hash y estarían en el mismo sector de almacenamiento.

Las clases Dictionary<TKey, TValue> y ConcurrentDictionary<TKey, TValue>tienen la misma funcionalidad que la clase Hashtable. Un Dictionary<TKey, TValue> de un tipo específico (distinto de Object) proporciona un rendimiento mayor que una Hashtable para los tipos de valor. Esto se debe a que los elementos de Hashtable son de tipo Object; por tanto, la aplicación de la conversión boxing y unboxing normalmente se produce al almacenar o recuperar un tipo de valor. La clase ConcurrentDictionary<TKey, TValue>se debe usar cuando varios subprocesos puedan tener acceso a la colección simultáneamente.

Vea también

Referencia

Hashtable

IDictionary

IHashCodeProvider

Dictionary<TKey, TValue>

System.Collections.Generic.IDictionary<TKey, TValue>

System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>

Conceptos

Tipo de colección HashSet

Otros recursos

Tipos de colección utilizados normalmente