C ++: Как вычислить хеш-значение из нескольких хешируемых членов?

Предположим, у меня есть класс C ++

class T {
Type1 member1;
Type2 member2;
Type3 member3;
unsigned long hash() {
// How to implement?
}
};

Предполагая, что каждый член хэш-функции member.hash(), Каков наилучший способ реализации hash функция класса T? Java имеет HashCodeBuilder класс, специфичный для этой задачи, есть ли аналог в C ++?

Я знаю, что одним из возможных решений может быть что-то вроде

member1.hash() + member2.hash() * 17 + member3.hash() * 37

Это вообще хорошая хеш-функция? А как мне выбрать константы 17, 37 и т. Д., Особенно? если я более 3 членов?

Другой незначительный вопрос предполагает, что один из моих членов имеет примитивный тип (int, float, stringи т. д.), как мне сгенерировать из него значение хеша?

0

Решение

Boost есть что-то для этого: hash_combine

size_t seed = 0;
boost::hash_combine(seed, member1);
boost::hash_combine(seed, member2);
boost::hash_combine(seed, member3);
return seed;
3

Другие решения

Если вы используете неупорядоченные контейнеры из std Вы можете рассмотреть способ, указанный на примере в http://en.cppreference.com/w/cpp/utility/hash

std::size_t operator()(S const& s) const
{
std::size_t h1 = std::hash<std::string>()(s.first_name);
std::size_t h2 = std::hash<std::string>()(s.last_name);
return h1 ^ (h2 << 1);
}
0

По вопросам рекламы [email protected]