Предположим, у меня есть 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
и т.д.), как я должен сгенерировать хеш-значение от него?
В качестве третьей альтернативы, вы можете построить поразрядное представление трех типов, а затем использовать перегрузку 'std :: hash' для' std :: bitset' или 'std :: vector'. Это, однако, вероятно, дает гораздо более медленную производительность по сравнению с другими предложениями, которые применяют только некоторые побитовые операции. –
davidhigh
@davidhigh Это также маловероятно, чтобы работать для многих типов объектов. Поразрядное представление - значение _not_ объекта. –