Chel-хэш-функция для массива int
Мне нужно специализировать хэш-функцию для unordered_map
, поэтому я могу использовать int-массивы как ключи. Значения массива обычно равны 0 или 1, например. int array = {0, 1, 0, 1}
, но технически не ограничен.
Может кто-то порекомендовать хорошую хэш-функцию в этом случае? В качестве альтернативы, я всегда могу преобразовать массив int в строку и избежать специализации. Но меня беспокоит производительность, так как у меня может быть несколько миллионов таких массивов.
Ответы
Ответ 1
С++ TR1 содержит функцию хэш-шаблона.
Если вы еще этого не сделали, вы можете использовать Boost Hash.
Идея для удобного помощника:
#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);
}
Это будет (примерно?) эквивалентно
size_t seed = 0;
for (const T* it=arr; it!=(arr+N); ++it)
boost::hash_combine(seed, *it);
return seed;
Не забудьте реализовать правильные операции сравнения сравнений, если вы используете этот хеш для поиска
Ответ 2
Попробуйте использовать хеш-функцию lookup8. Эта функция ОЧЕНЬ быстрая и хорошая.
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);