Нет, никто не знает - он может варьироваться от одной реализации к другой. Основные требования (N3092, §20.8.15):
Для всех типов объектов ключа, для которого существует специализация хэш, то конкретизация хэш должен:
- удовлетворяют требованиям Hash (20.2.4) , с ключом в качестве аргумента типа вызова функции, то DefaultConstructible требования (33), CopyAssignable требования (37),
- быть заменой (20.2.2) для lvalues,
- обеспечивают две вложенные типы result_type и argument_type, которые должны быть синонимы для size_t и Key, соответственно,
- удовлетворяют требованию, что если k1 == k2 истинно, h (k1) == h (k2) также истинно, где h - объект типа hash, а k1 и k2 - объекты типа Key.
и (N3092, §20.2.4):
типа Н удовлетворяет требования Хеша, если:
- это тип объекта функции (20.8),
- его satisifes требования CopyConstructible and Destructible (20.2.1),
- выражения, приведенные в следующей таблице, действительны и имеют указанную семантику, а
- он удовлетворяет всем остальным требованиям в этом подпункте.
§20.8.15 покрывает требования к результату хэширования, §20.2.4 на самом хеше. Однако, как вы можете видеть, оба они довольно общие. Таблица, которая упоминается в основном охватывает еще три требования:
- Хэш-функция должна быть «чистой» (т.е. результат зависит только от входа, а не какой-либо контекста, истории и т.д.)
- функция должна не изменять аргумент, который ему передан, и
- Он не должен исключать какие-либо исключения.
Точные алгоритмы определенно не указано, хотя - и, несмотря на длину, большую часть требований выше, на самом деле просто заявляющие требования, которые (по крайней мере мне) кажется довольно очевидным. Короче говоря, реализация может свободно внедрять хеширование практически любым способом.
Если долгое время было 64. было бы приемлемым метод для высоких и низких? –
@Martin: Это было бы, но если это хорошая хеш-функция, это не сделало бы ее более или менее случайной, чем сама по себе высокая или низкая 32 бит. Если это не хорошая хэш-функция, xor может сделать ее лучше или хуже, в зависимости от того, как * хэш-функция не очень хороша. Хорошая хеш-функция пытается достичь «максимальной случайности» всех бит. Для того, чтобы 64-битное значение было «случайным», его 32-разрядные части должны быть «случайными». Xoring их вместе не повредит, но отдельные части должны быть уже «случайными», как это происходит. – sth