constexpr std::hash

Дмитрий Назаров
Дмитрий Назаров

В некоторых ситуациях было бы полезно уметь вычислять хэш на этапе компиляции. Например, для строковых литералов сигнатура могла бы выглядеть как-нибудь вот так.

template<size_t _Size>
struct hash<char const (&)[_Size]>
{
    constexpr hash() = default;

    using _S = char const [_Size];
    constexpr std::size_t operator()(_S &str) const noexcept
    {
        return constexpr_implementation(str, _Size); // релизация компилятором того или иного алгоритма
    }
};

Преемущества - возможность использования результата везде, где можно использовать constexpt. Например, в switch конструкции.

13
рейтинг
4 комментария
yndx-antoshkka
Добавлю в один из своих ближайших proposal на constexpr
yndx-antoshkka
WPMGPRoSToTeMa
В switch как-то слишком оптимистично из-за коллизий, там нужно идеальное хэширование.
WPMGPRoSToTeMa
Дмитрий Назаров
Коллизии случаются, это так. Главная идея заключается в том, что для constexpr объектов сам хэш также можно посчитать на этапе компиляции. Применять ли его в switch - дело вкуса. Для какого-то небольшого подмножества объектов, например, реализованной компилятором хэш функции может быть вполне достаточно.
Дмитрий Назаров
WPMGPRoSToTeMa
en.cppreference.com/w/cpp/utility/hash#Notes
> Hash functions are only required to produce the same result for the same input within a single execution of a program

Мне кажется из-за этого std::hash нельзя сделать constexpr, т.е. скорее всего придётся вводить новый std::hash, например, через tag dispatching.
WPMGPRoSToTeMa
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).