Нет, на самом деле никто не знает - это может варьироваться от одной реализации к другой. Основные требования (N3092, §20.8.15):
Для всех типов объектов Ключ, для которого существует хеш специализации, хеш экземпляра должен:
- удовлетворяет требованиям Hash (20.2.4), с Key в качестве типа аргумента вызова функции, требований DefaultConstructible (33), требований CopyAssignable (37),
- быть заменяемым (20.2.2) для lvalues,
- предоставляет два вложенных типа result_type и arguments_type, которые должны быть синонимами для size_t и Key соответственно
- удовлетворяет требованию, что если k1 == k2 истинно, h (k1) == h (k2) также истинно, где h - объект типа hash, а k1 и k2 - объекты типа Key.
и (N3092, §20.2.4):
Тип H соответствует требованиям Hash, если:
- это тип объекта функции (20.8),
- удовлетворяет требованиям CopyConstructible и Destructible (20.2.1),
- выражения, показанные в следующей таблице, являются действительными и имеют указанную семантику, а
- удовлетворяет всем остальным требованиям этого подпункта.
§20.8.15 охватывает требования к результату хеширования, §20.2.4 к самому хешу. Как вы можете видеть, однако, оба довольно общие. Упомянутая таблица в основном охватывает еще три требования:
- Хеш-функция должна быть "чистой" (то есть результат зависит только от ввода, а не от контекста, истории и т. Д.)
- Функция не должна изменять переданный ей аргумент, и
- Не должно быть никаких исключений.
Точные алгоритмы определенно не определены , хотя - и, несмотря на длину, большинство требований, приведенных выше, на самом деле просто устанавливают требования, которые (по крайней мере для меня) кажутся довольно очевидными. Короче говоря, реализация может свободно реализовывать хеширование практически любым способом.