Кажется std :: hash functions для C ++ 17 string_view не являются constexpr.
Мне кажется, что строковое представление, привязанное к const char [], может быть хешировано во время компиляции (что было бы очень мило), или есть что-нибудь, что мешает этому?
Начиная с C ++ 14 (см. 17.6.3.4 Требования к хешу, таблица 26), мы имеем:
Возвращаемое значение должно зависеть только от аргумента k для продолжительности
программы. [Примечание: Таким образом, все оценки выражения h (k) с
то же самое значение для к дает тот же результат для данного исполнения
программа. — конечная нота]
Два разные исполнения могут давать разные хэши:
Хеш-функции требуются только для получения того же результата для
тот же вход в рамках одного исполнения программы;
это позволяет соленые хэши, которые предотвратить столкновения DoS-атак.
Такое поведение полезно смягчить DoS-атаки на основе хэш-атак.
Вот формулировка о требованиях Hash
Концепция из стандарта C ++ 17:
Возвращаемое значение должно зависеть только от аргумента k
на время программы. [Примечание: таким образом, все
оценки выражения h (k) с одинаковыми
значение для к дает тот же результат для
данное исполнение программы. — конец примечания]
В нем ничего не говорится о случайном хешировании. std::hash
текст не обязателен и не исключает случайного хеширования.
Вот N3242 2011-02-28 проект, в котором не упоминается «на время действия программы»:
Не будет бросать исключения. Возвращаемое значение зависит только от
на аргументе к. [Примечание: при этом все оценки выражения h (k)
с тем же значением для k дают тот же результат. — конец примечания
Мы можем видеть, что добавление «для продолжительности программы» «для данного выполнения программы» было добавлено в качестве разрешения для »2291. std :: hash уязвим для коллизионной DoS-атаки».
AFAIU, нет реализации std::hash
реализует случайное хеширование, но вы можете написать свой собственный my::secure_hash
,
Других решений пока нет …