Соберите хеш -функцию
-
29-09-2019 - |
Вопрос
В локальном объекте есть корачная аспекта.
У Clate Facet есть хэш -метод, который возвращает долгое время.
http://www.cplusplus.com/reference/std/locale/collate/hash/
Два вопроса:
- Кто -нибудь знает, какой метод хэшина используется.
- Мне нужно 32 -битное значение.
Если у меня длиннее 32 бит, кто -нибудь знает о методах складывания хэша в более короткую версию. Я вижу, что если законно закончить, что складывание может генерировать много столкновений (и хотя я могу справиться с столкновениями, так как мне все равно нужно принять это во внимание, я бы предпочел, чтобы они были сведены к минимуму).
Примечание: я не могу использовать функции C ++ 0x
Повышение может быть в порядке.
Решение
Нет, никто на самом деле не знает - это может варьироваться от одной реализации к другой. Основными требованиями являются (N3092, §20.8.15):
Для всех типов объектов ключ, для которого существует хэш специализации, хэш экземпляров должен:
- удовлетворить требования хеша (20.2.4), с ключом в качестве типа аргумента вызова функции, требования по умолчанию (33), требования копирования (37),
- быть заменен (20.2.2) для lvalues,
- Предоставьте два вложенных типа Result_type и Argent_type, которые должны быть синонимами для size_t и key, соответственно,
- Удовлетворяйте требование, что если k1 == k2 верно, h (k1) == h (k2) также является истинной, где h является объектом хэша и K1 и K2 и K2 объектами типа ключа.
и (N3092, §20.2.4):
Тип H соответствует требованиям хэш, если:
- это тип объекта функции (20,8),
- это удовлетворяет требованиям подражаемого и разрушимых (20.2.1),
- выражения, показанные в следующей таблице, действительны и имеют указанную семантику, и
- Он удовлетворяет всем другим требованиям в этом подпункте.
§20.8.15 охватывает требования в результате хеширования, §20.2.4 на самом хеш. Однако, как вы можете видеть, оба довольно общие. Таблица, которая упоминается в основном, охватывает еще три требования:
- Хеш -функция должна быть «чистой» (то есть результат зависит только от ввода, а не какого -либо контекста, истории и т. Д.)
- Функция не должна изменять аргумент, который передается ему, и
- Это не должно делать никаких исключений.
Точные алгоритмы определенно нет Однако указано - и, несмотря на длину, большинство вышеупомянутых требований на самом деле просто заявляют о требованиях, которые (по крайней мере, для меня) кажутся довольно очевидными. Короче говоря, реализация может свободно реализовать хэширование практически любым способом.
Другие советы
Если реализация использует разумную хэш -функцию, в значении хэша не должно быть битов, которые имеют какую -либо особую корреляцию с входом. Так что, если функция хеш дает вам 64 «случайные» биты, но вы хотите только 32 из них, вы можете просто взять первый/последний/... 32 бита значения, как вам угодно. Какие из них вы принимаете, не имеет значения, так как каждый бит такой же случайный, как и следующий (это то, что делает хорошую хэш -функцию).
Таким образом, простейшим и в то же время совершенно разумным способом получить 32-разрядную хеш-значение было бы:
int32_t value = hash(...);
(Конечно, это разрушает группы из 4 миллиардов значений до одного, что выглядит как многое, но этого нельзя избежать, если в четыре миллиарда раз больше исходных значений, чем целевые значения.)