Пространства имён
Варианты
Действия

std::hash

Материал из cppreference.com
< cpp‎ | utility


Определено в заголовочном файле <functional>
template< class Key >
struct hash; // not defined
(начиная с C++11)
Хэш-шаблон определяет функцию объекта, который реализует хэш-функции. Экземпляры этого объекта функции определяют operator(), что:
Оригинал:
The hash template defines a function object that implements a хэш-функции. Instances of this function object define an operator() that:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1. Принимает один параметр типа Key.
Оригинал:
1. Accepts a single parameter of type Key.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2. Возвращает значение типа size_t, представляющий хэш-значение параметра.
Оригинал:
2. Returns a value of type size_t that represents the hash value of the parameter.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3. Не бросать исключения при вызове.
Оригинал:
3. Does not throw exceptions when called.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
4. В течение двух параметров k1 и k2, которые являются равными, std::hash<Key>()(k1) == std::hash<Key>()(k2).
Оригинал:
4. For two parameters k1 and k2 that are equal, std::hash<Key>()(k1) == std::hash<Key>()(k2).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
5. За два различных параметров k1 и k2, что не равны, вероятность того, что std::hash<Key>()(k1) == std::hash<Key>()(k2) должна быть очень мала, приближаясь 1.0/std::numeric_limits<size_t>::max().
Оригинал:
5. For two different parameters k1 and k2 that are not equal, the probability that std::hash<Key>()(k1) == std::hash<Key>()(k2) should be very small, approaching 1.0/std::numeric_limits<size_t>::max().
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Хэш-шаблон и CopyConstructible и Destructible.
Оригинал:
The hash template is both CopyConstructible and Destructible.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Неупорядоченный ассоциативных контейнеров std::unordered_set, std::unordered_multiset, std::unordered_map, std::unordered_multimap использовать специализаций шаблона std::hash по умолчанию хэш-функцию.
Оригинал:
The unordered associative containers std::unordered_set, std::unordered_multiset, std::unordered_map, std::unordered_multimap use specializations of the template std::hash as the default hash function.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Типы-члены

argument_type Key
result_type std::size_t

[править] Функции-члены

создает хэш-функции объекта
Оригинал:
constructs a hash function object
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член)
вычисления хэш аргумента
Оригинал:
calculate the hash of the argument
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член)

[править] Стандартный специализации для основных типов

Определено в заголовочном файле <functional>
template<> struct hash<bool>;

template<> struct hash<char>;
template<> struct hash<signed char>;
template<> struct hash<unsigned char>;
template<> struct hash<char16_t>;
template<> struct hash<char32_t>;
template<> struct hash<wchar_t>;
template<> struct hash<short>;
template<> struct hash<unsigned short>;
template<> struct hash<int>;
template<> struct hash<unsigned int>;
template<> struct hash<long>;
template<> struct hash<long long>;
template<> struct hash<unsigned long>;
template<> struct hash<unsigned long long>;
template<> struct hash<float>;
template<> struct hash<double>;
template<> struct hash<long double>;

template< class T > struct hash<T*>;

[править] Стандартный специализации для библиотеки типов

хеширование строк
(специализация шаблона класса) [edit]
хэш поддержку std::error_code
Оригинал:
hash support for std::error_code
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [edit]
хэш поддержку std::bitset
Оригинал:
hash support for std::bitset
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [edit]
хэш поддержку std::unique_ptr
Оригинал:
hash support for std::unique_ptr
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [edit]
хэш поддержку std::shared_ptr
Оригинал:
hash support for std::shared_ptr
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [edit]
хэш поддержку std::type_index
Оригинал:
hash support for std::type_index
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [edit]
хэш поддержку std::vector<bool>
Оригинал:
hash support for std::vector<bool>
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса)
хэш поддержку std::thread::id
Оригинал:
hash support for std::thread::id
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса)

[править] Примеры

Демонстрирует вычисления хэш для std::string, типа, который уже имеет хэш специализация .

Оригинал:

Demonstrates the computation of a hash for std::string, a type that already has a hash specialization.

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#include <iostream>
#include <functional>
#include <string>
 
int main()
{
    std::string str = "Meet the new boss...";
    std::hash<std::string> hash_fn;
    size_t str_hash = hash_fn(str);
 
    std::cout << str_hash << '\n';
}

Вывод:

391070135

Демонстрирует создание хэш-функции для определенного пользователем типа. Используя это в качестве параметра шаблона для std::unordered_map, std::unordered_set и т.д., также требует специализации std::equal_to .

Оригинал:

Demonstrates creation of a hash function for a user defined type. Using this as a template parameter for std::unordered_map, std::unordered_set, etc. also requires specialization of std::equal_to.

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#include <iostream>
#include <functional>
#include <string>
 
struct S {
    std::string first_name;
    std::string last_name;
};
 
template<class T> class MyHash;
 
template<>
class MyHash<S> {
public:
    size_t operator()(const S &s) const
    {
        size_t h1 = std::hash<std::string>()(s.first_name);
        size_t h2 = std::hash<std::string>()(s.last_name);
        return h1 ^ (h2 << 1);
    }
};
 
int main()
{
    std::string s1 = "Hubert";
    std::string s2 = "Farnsworth";
    std::hash<std::string> h1;
 
    S n1;
    n1.first_name = s1;
    n1.last_name =  s2;
 
    std::cout << "hash(s1) = " << h1(s1) << "\n"
              << "hash(s2) = " << std::hash<std::string>()(s2) << "\n"
	      << "hash(n1) = " << MyHash<S>()(n1) << "\n";
 
}

Вывод:

hash(s1) = 6119893563398376542
hash(s2) = 14988020022735710972
hash(n1) = 17649170831080298918

Демонстрирует специализируются std::hash для пользователей определенного типа .

Оригинал:

Demonstrates how to specialize std::hash for a user defined type.

Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#include <iostream>
#include <functional>
#include <string>
 
struct S {
    std::string first_name;
    std::string last_name;
};
 
namespace std {
template<>
class hash<S> {
public:
    size_t operator()(const S &s) const
    {
        size_t h1 = std::hash<std::string>()(s.first_name);
        size_t h2 = std::hash<std::string>()(s.last_name);
        return h1 ^ ( h2 << 1 );
    }
};
}
 
int main()
{
    S s;
    s.first_name = "Bender";
    s.last_name =  "Rodriguez";
    std::hash<S> hash_fn;
 
    std::cout << "hash(s) = " << hash_fn(s) << "\n";
}

Вывод:

hash(s) = 32902390710