--- /dev/null
+#include "hashtable.h"
+
+/// Constructor
+HashTable::
+HashTable(size_type size):
+ table(size)
+{
+}
+
+/// Función de hash
+HashTable::size_type
+HashTable::
+hash(const std::string& val)
+{
+ size_type h = 0;
+ for (unsigned char* p = (unsigned char*)val.c_str(); *p != '\0';
+ p++)
+ {
+ h = 37 * h + *p;
+ }
+ return h % table.size();
+}
+
+// Uso interno
+namespace
+{
+ /// Functor para encontrar pares con clave igual
+ struct ClaveIgualA
+ {
+ const std::string& clave;
+ ClaveIgualA(const std::string& clave): clave(clave) {}
+ bool operator()(const HashTable::pair_type& par)
+ {
+ return par.first == clave;
+ }
+ };
+}
+
+/// Agrega entrada
+void *&
+HashTable::
+operator[](const std::string& key)
+{
+ size_type pos = hash(key);
+ list_type::iterator par = std::find_if(table[pos].begin(),
+ table[pos].end(), ClaveIgualA(key));
+ if (par == table[pos].end()) // No encontrada
+ {
+ // La agrego
+ table[pos].push_back(pair_type(key, 0));
+ return table[pos].back().second;
+ }
+ else return par->second;
+}
+
--- /dev/null
+#ifndef _HASHTABLE_H_
+#define _HASHTABLE_H_
+
+#include <utility>
+#include <vector>
+#include <string>
+#include <list>
+
+/// Tabla Hash (abierta)
+struct HashTable
+{
+
+ /// Tipo de dato para almacenar los pares clave, valor
+ typedef std::pair< std::string, void * > pair_type;
+
+ /// Tipo de dato para almacenar una lista de pares
+ typedef std::list< pair_type > list_type;
+
+ /// Tipo de dato para almacenar los pares
+ typedef std::vector< list_type > table_type;
+
+ /// Tipo de dato del tamaño del contenedor
+ typedef table_type::size_type size_type;
+
+ /// Constructor
+ HashTable(size_type size);
+
+ /// Función de hash
+ size_type hash(const std::string& val);
+
+ /// Agrega entrada
+ void *& operator[](const std::string& key);
+
+ protected:
+
+ /// Contenedor usado para implementar la tabla hash
+ table_type table;
+
+};
+
+#endif // _HASHTABLE_H_