Предположим, у меня есть класс 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
и т. д.), как мне сгенерировать из него значение хеша?
Boost есть что-то для этого: hash_combine
size_t seed = 0;
boost::hash_combine(seed, member1);
boost::hash_combine(seed, member2);
boost::hash_combine(seed, member3);
return seed;
Если вы используете неупорядоченные контейнеры из 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);
}