Хорошая хэш-функция для вектора

У меня есть некоторый вектор целого числа, который я бы хотел эффективно хранить в 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 У меня есть несколько вопросов

  • как часто вычисляется хэш, только одно, какое-то случайное число или раз?
  • Было бы целесообразно создать объект-оболочку с == и хеш-функциями, чтобы запомнить хэш и избежать его вычисления более одного раза?

При профилировании я заметил, что довольно большое количество времени моего процессора тратит на поиск неуправляемых карт, это не совсем оптимально: (

Ответы

Ответ 2

Итак, когда вы не хотели использовать 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;
}

Кажется, работает.