2014-09-17 2 views
1

У меня есть база данных патчей изображений, то есть 300 * 300 изображений с каждым патчем размером 60 * 60. Таким образом, я получаю сетку 5 * 5. Я хочу сохранить некоторую информацию против каждого из этих патчей. Поскольку моя база данных может состоять из миллионов изображений, я хотел бы использовать unordered_map, чтобы найти патч стало легко.Как определить собственную хэш-функцию для unordered_map в C++

Информация о моем патче состоит из imgId, x_position патча и y_position патча (все целые числа). У меня нет большого опыта работы с unordered_map. Но, пройдя несколько уроков, я понял, что мне придется использовать собственную хэш-функцию. Может ли кто-нибудь предложить эффективный способ хранения вышеуказанной информации в unordered_map с надлежащей хэш-функцией.

+0

Должен ли ваш хэш быть основан на указателе идентификации, который вы указали, или на базовых данных в базе данных? – Deduplicator

+3

Используйте 'std :: hash ' и см. Http://stackoverflow.com/questions/2590677/how-do-i-combine-hash-values-in-c0x –

+0

@Deduplicator Мне нужно найти значения на основе imgId, x и y. Это их комбинация является первичным ключом. – user3747190

ответ

0

Вы можете использовать любую хеш-функцию, которую вы хотите комбинировать с тремя целыми числами. Вот классический 32-разрядный объединитель Knuth:

int hash(int v1, int v2, int v3) 
{ 
    int v = v1; 
    v *= 2654435741; 
    v += v2; 
    v *= 2654435761; 
    v ^= v3; 
    v *= 2654435789; 
    return v; 
} 
+0

Я подумал, что предпочтительнее, чтобы 3 константы были первыми, но разными ... Зачем использовать те же 3 раза? –

+0

@BasileStarynkevitch Это не имеет большого значения. Я изменил их, без особых причин. ;) –

+3

э-э ... UB? :) –

Смежные вопросы