Считайте, что ваш struct
в целом представляет собой строку байтов (7, если быть точным). Вы можете использовать любую общепринятую строковую хеш-функцию для этих 7 байтов. Вот общая хеш-функция битовой строки FNV (Fowler/Noll/Vo), примененная к вашему примеру (в данном классе хэш-функторов):
inline std::size_t operator()(const exemple& obj ) const
{
const unsigned char* p = reinterpret_cast<const unsigned char*>( &obj );
std::size_t h = 2166136261;
for (unsigned int i = 0; i < sizeof(obj); ++i)
h = (h * 16777619) ^ p[i];
return h;
}
Обратите внимание, как я преобразовал ссылку на структуру exemple
(obj
) в указатель на const unsigned char
, чтобы иметь доступ к байтам структуры один за другим, и я рассматриваю ее как непрозрачный двоичный объект. Обратите внимание, что sizeof(obj)
на самом деле может быть 8, а не 7, в зависимости от заполнения компилятора (что означало бы, что где-то в структуре есть байт заполнения мусора, вероятно, между c
и n
. Если вы хотите, вы можете переписать хеш-функцию, чтобы перебирать a
, b
и c
, а затем байты n
по порядку (или в любом порядке), что устранит влияние любых байтов заполнения (которые могут существовать или не существовать) на хэш вашего struct
.
Да, плохая хэш-функция может сделать unordered_map
медленнее, чем ordered_map
. Это не всегда обсуждается, потому что предполагается, что обобщенные быстрые алгоритмы, такие как приведенный выше хэш FNV, используются теми, кто использует unordered_map
, и в этих случаях обычно unordered_map
быстрее, чем ordered_map
за счет возможности перебирать элементы контейнера по порядку. Однако да, вы должны использовать хорошую хеш-функцию для своих данных, и обычно достаточно использовать один из этих хорошо известных хэшей. В конечном счете, однако, у каждой хэш-функции есть свои недостатки, зависящие от распределения входных данных (здесь — содержимого структуры exemple
).
Хорошее обсуждение обобщенного хеширования и примеры хэш-функций можно найти на странице Eternally Confuzzled, включая Хэш FNV в стиле C похож на тот, который я вам дал.
person
Matthew Hall
schedule
15.11.2012
hash(string)
. Я мог бы создать функцию, которая преобразуетint
в строку, затем объединяет ее с тремяchars
, а затем завершает функциюreturn hash(StringIjustMade);
, что отличается от фактического написания логики хэширования низкого уровня самостоятельно. . - person evanmcdonnal   schedule 15.11.2012unary_function
. Этот материал официально бесполезен с тех пор, как навсегда. - person pmr   schedule 15.11.2012