Ответ 1
Всегда идите с экспертами, когда это возможно: http://www.boost.org/doc/libs/release/doc/html/hash/reference.html#boost.hash_combine
У меня есть некоторый вектор целого числа, который я бы хотел эффективно хранить в unordered_map в С++ 11, мой вопрос таков:
Как лучше сохранить и оптимизировать запросы .find
?
Я придумал следующий хешер:
class uint32_vector_hasher {
public:
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t ret = 0;
for(auto& i : vec) {
ret ^= std::hash<uint32_t>()(i);
}
return ret;
}
};
а затем сохраните объекты в unordered_map
У меня есть несколько вопросов
==
и хеш-функциями, чтобы запомнить хэш и избежать его вычисления более одного раза?При профилировании я заметил, что довольно большое количество времени моего процессора тратит на поиск неуправляемых карт, это не совсем оптимально: (
Всегда идите с экспертами, когда это возможно: http://www.boost.org/doc/libs/release/doc/html/hash/reference.html#boost.hash_combine
Итак, когда вы не хотели использовать boost, комментарий Майкла Блюрра приводил к следующей реализации функции хэш-функции:
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t seed = vec.size();
for(auto& i : vec) {
seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
return seed;
}
Кажется, работает.