2011-08-22 56 views
11

Necesito especializar la función hash para unordered_map para poder usar matrices int como claves. Los valores de matriz generalmente son 0 o 1, p. int array = {0, 1, 0, 1}, pero técnicamente no limitado.C++ función hash para una matriz int

¿Alguien puede recomendar una buena función hash en este caso? Alternativamente, siempre puedo convertir la matriz int en una cadena y evitar la especialización. Pero me preocupa el rendimiento ya que puedo tener varios millones de estas matrices.

+2

Usa o imita el "hash de rango" de Boost. Se construye llamando repetidamente a 'hash_combine', que también está en Boost y realmente debería estar en el estándar. –

+0

Si tiene varios millones de esas matrices, sugiero nuevos algoritmos/estructuras de datos ... – Blindy

+0

@Blindy ¿Qué estructuras de datos sugeriría? – gewizz

Respuesta

6

C++ TR1 contiene una función de plantilla hash.

Si aún no lo tiene, puede usar Boost Hash.

idea para un ayudante práctico:

#include <boost/functional/hash.hpp> 

template <typename T, int N> 
    static std::size_t hasharray(const T (&arr)[N]) 
{ 
    return boost::hash_range(arr, arr+N); 
} 

Esto sería (? Más o menos) equivalente a

size_t seed = 0; 
for (const T* it=arr; it!=(arr+N); ++it) 
    boost::hash_combine(seed, *it); 
return seed; 

No se olvide de poner en práctica la igualdad de operaciones de comparación adecuados, si está usando este hash para buscar

+0

Creo que debería ser 'std :: size_t N' porque se garantiza que' std :: size_t' será capaz de representar el tamaño de la matriz más grande posible, mientras que 'int' podría desbordarse (dependiendo del sistema). Además, no necesita ser un tipo firmado. – outofthecave

+0

@outofthecave fair points. Sin embargo, unsigned es contagioso y eso lo hace poco manejable para las compensaciones (pueden ser negativas, y 'N-10' simplemente se ajustará si' N <10'. ¡Sorpresa!). Además, ¿las matrices están tipadas estáticamente a más de 2³¹ elementos? Esos son raros. Y a menudo no estarías metiéndolos, si los tuvieras. – sehe

5

Probar el uso lookup8 función hash. Esta función es MUY rápida y buena.

int key[100]; 
int key_size=10; 
for (int i=0;i<key_size;i++) key[i]=i; //fill key with sample data 
ub8 hash=hash((ub8*)key, sizeof(key[0])*key_size, 0); 
+0

Eso no es C++. – Puppy

+9

Por lo general, las funciones hash se escriben en texto simple c. Puede crear un contenedor C++ para ello. – vromanov

+2

Normalmente, las funciones hash se escriben * en el idioma en cuestión *. – Puppy

Cuestiones relacionadas