Вопрос
Что такое хорошая специализация std:: hash для использования в третьем параметре шаблона std:: unordered_map или std:: unordered_set для определенного пользователем типа, для которого все типы данных членов уже имеют хорошую специализацию std:: хэш?
По этому вопросу я определяю "хороший", как простой для реализации и понимания, разумно эффективный и вряд ли создающий столкновение с хэш-таблицами. Определение good не содержит никаких утверждений о безопасности.
Состояние того, что является Google'able
На данный момент два вопроса StackOverflow - это первые хиты для поиска в Google "std hash specialization".
Первый, Как специализировать std:: hash:: operator() для пользовательского типа в неупорядоченных контейнерах?, адресует, является ли законным открытие std namespace и добавьте специализированные шаблоны.
Второй, Как специализировать std:: hash для типа из другой библиотеки, по существу решает тот же вопрос.
Это оставляет текущий вопрос. Учитывая, что реализации стандартной библиотеки С++ для хеш-функций для примитивных типов и типов в стандартной библиотеке, что является простым и эффективным способом специализации std:: hash для пользовательских типов? Есть ли хороший способ комбинировать хэш-функции, предоставляемые реализацией стандартной библиотеки?
(Редактировать спасибо dyp.) Другой вопрос в StackOverflow описывает, как объединить пару хеш-функций.
Другие результаты Google больше не помогают.
Это В статье доктора Доббса говорится, что XOR из двух удовлетворительных хэшей приведет к новому удовлетворительному хешу.
Эти статьи, кажется, говорят из-за знания и подразумевают много вещей, но легки в деталях. Это противоречит статье доктора Доббса в кратком замечании в первом примере, говоря, что использование XOR для объединения хеш-функций приводит к слабой результирующей хэш-функции.
Поскольку XOR применяется к любым двум равным значениям, результат равен 0, я вижу, почему XOR сам по себе является слабым.
Мета-вопрос
Хорошо аргументированный ответ, объясняющий, почему этот вопрос является недействительным и на который нельзя ответить, также приветствуется.