Обычно вам нужно, чтобы ваша хеш-функция соответствовала равенству, определенному в ваших классах.Возможно, равенство определяется перегруженной operator==
, но даже если она не перегружена, вы можете подумать, что два объекта следует считать равными и иметь одинаковый хэш-код, если все их элементы данных равны.
Хешированиенеобработанные байты не работают вообще.Нет гарантии, что два объекта, все члены данных которых равны, будут иметь равные байты.Например, где-то в объекте может быть некоторое заполнение по причинам выравнивания, а байты заполнения могут принимать любое значение.
Что еще хуже, нет гарантии, что два равных значения double
имеют равные байты.Например, положительное / отрицательное нулевое сравнение равно.
Случай C особенно сложен: если два объекта C указывают на разные otherClass
объекты, но два объекта otherClass
равны, то если дваОбъекты C имеют одинаковое значение хеша?Вы не можете определить это в полной общности, это свойство класса C.
Может ли что-то быть "неоптимальным", если это также лучшее, что возможно?;-) Единственное общее решение - определить функцию hash
и написать версию для каждого класса.В вашем случае вы могли бы сделать это виртуальной функцией A, но вы также можете посмотреть, как std::hash
работает в C ++ 0x: это на самом деле класс функтора шаблонов, а не функция, и он может быть специализирован для пользовательскихклассы.Конечно, это не обеспечивает динамический полиморфизм, но если вы специализируете его для A
и у вас есть вызов реализации виртуальной функции, которую вы реализуете в каждом классе, тогда ваша хеш-функция будет работать с std::unordered_map
и т. Д.