2014-11-13 2 views
0

Предположим, у меня есть 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

В качестве третьей альтернативы, вы можете построить поразрядное представление трех типов, а затем использовать перегрузку 'std :: hash' для' std :: bitset' или 'std :: vector '. Это, однако, вероятно, дает гораздо более медленную производительность по сравнению с другими предложениями, которые применяют только некоторые побитовые операции. – davidhigh

+0

@davidhigh Это также маловероятно, чтобы работать для многих типов объектов. Поразрядное представление - значение _not_ объекта. –

ответ

3

подталкивания есть что-то для этого: hash_combine

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

Если вы используете неупорядоченные контейнеры из 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

Не уверен, что это особенно хорошее решение, поскольку оно теряет некоторые бит. Обычно я использовал что-то вроде «return 127 * h1 + h2;», хотя другие алгоритмы также работают. –

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