std:: hash
|
ν€λμ μ μλ¨
<bitset>
|
||
|
ν€λμ μ μλ¨
<coroutine>
|
(C++20λΆν°)
|
|
|
ν€λμ μ μλ¨
<chrono>
|
(C++26λΆν°)
|
|
|
ν€λμ μ μλ¨
<filesystem>
|
(C++17λΆν°)
|
|
|
ν€λμ μ μλ¨
<functional>
|
||
|
ν€λμ μ μλ¨
<memory>
|
||
|
ν€λμ μ μλ¨
<optional>
|
(C++17λΆν°)
|
|
|
ν€λμ μ μλ¨
<stacktrace>
|
(C++23λΆν°)
|
|
|
ν€λμ μ μλ¨
<string>
|
||
|
ν€λμ μ μλ¨
<string_view>
|
(C++17λΆν°)
|
|
|
ν€λμ μ μλ¨
<system_error>
|
||
|
ν€λμ μ μλ¨
<text_encoding>
|
(C++26λΆν°)
|
|
|
ν€λμ μ μλ¨
<thread>
|
||
|
ν€λμ μ μλ¨
<typeindex>
|
||
|
ν€λμ μ μλ¨
<utility>
|
(C++26λΆν°)
|
|
|
ν€λμ μ μλ¨
<variant>
|
(C++17λΆν°)
|
|
|
ν€λμ μ μλ¨
<vector>
|
||
|
template
<
class
Key
>
struct hash ; |
(C++11λΆν°) | |
hash
ν
νλ¦Ώμ νμ±νλ νΉμνλ€μ
ν΄μ ν¨μ
λ₯Ό ꡬννλ ν¨μ κ°μ²΄λ₯Ό μ μν©λλ€.
μ£Όμ΄μ§ νμ
Key
μ λν΄, κ° μ λ¬Έν
std::hash<Key>
λ
νμ±ν
λκ±°λ
λΉνμ±ν
λ©λλ€:
-
λ§μ½
std::hash<Key>κ° νλ‘κ·Έλ¨μ΄λ μ¬μ©μμ μν΄ μ 곡λμ§ μμΌλ©΄, λΉνμ±νλ©λλ€. -
κ·Έλ μ§ μμΌλ©΄,
std::hash<Key>λ λ€μμ λͺ¨λ μ‘°κ±΄μ΄ μΆ©μ‘±λ λ νμ±νλ©λλ€:
-
- λ€μ λͺ¨λ μꡬμ¬νμ λ§μ‘±ν©λλ€:
-
-
Hash
(
Keyλ₯Ό ν¨μ νΈμΆ μΈμ νμ μΌλ‘ μ¬μ©) - DefaultConstructible
- CopyAssignable
- Swappable
-
Hash
(
- λ€μ κ°λ€μ΄ μ£Όμ΄μ‘μ λ:
-
-
h
,
std::hash<Key>νμ μ κ°μ²΄ -
k1
κ³Ό
k2
,
Keyνμ μ κ°μ²΄λ€
-
h
,
-
λ€μ λͺ¨λ μꡬμ¬νμ λ§μ‘±ν©λλ€:
- λ§μ½ k1 == k2 κ° true λΌλ©΄, h ( k1 ) == h ( k2 ) λν true μ λλ€.
-
std::hash<Key>κ° νλ‘κ·Έλ¨ μ μ νΉμν κ° μλ ν, h ( k1 ) λ μμΈλ₯Ό λ°μμν€μ§ μμ΅λλ€.
-
κ·Έλ μ§ μμΌλ©΄,
std::hash<Key>λ λΉνμ±νλ©λλ€.
λΉνμ±νλ νΉμνλ Hash μꡬ μ¬νμ μΆ©μ‘±νμ§ μμΌλ©°, FunctionObject μꡬ μ¬νλ μΆ©μ‘±νμ§ μμ΅λλ€. κ·Έλ¦¬κ³ λ€μ κ°λ€μ λͺ¨λ false μ λλ€:
- std:: is_default_constructible < std :: hash < Key >> :: value
- std:: is_copy_constructible < std :: hash < Key >> :: value
- std:: is_move_constructible < std :: hash < Key >> :: value
- std:: is_copy_assignable < std :: hash < Key >> :: value
- std:: is_move_assignable < std :: hash < Key >> :: value
λ€μ λ§ν΄, κ·Έλ€μ μ‘΄μ¬νμ§λ§ μ¬μ©ν μ μμ΅λλ€.
μ€μ²© νμ
|
(C++20 μ΄μ ) |
λ©€λ² ν¨μ
|
ν΄μ ν¨μ κ°μ²΄λ₯Ό μμ±ν©λλ€
(public member function) |
|
|
μΈμμ ν΄μ κ°μ κ³μ°ν©λλ€
(public member function) |
νμ€ λΌμ΄λΈλ¬λ¦¬ νΉμν
λ€μ νμ
λ€μ λν΄ νμ±νλ
std::hash
νΉμνλ₯Ό μ 곡νλ κ° ν€λλ
std::hash
ν
νλ¦Ώμ μ μΈν©λλ€:
- λͺ¨λ cv-unqualified arithmetic types
- λͺ¨λ cv-unqualified enumeration types
- λͺ¨λ cv-unqualified pointer types
- std::nullptr_t
|
λ 립ν ꡬν μ μμ μΈκΈλ νΉμνλ€κ³Ό κΈ°λ³Έμ μΌλ‘ λΉνμ±νλ νΉμνλ€μ μ 곡ν΄μΌ ν©λλ€. |
(C++20λΆν°) |
κ²λ€κ°, μΌλΆ ν€λλ λΌμ΄λΈλ¬λ¦¬ νμ
μ λν΄ λ€λ₯Έ νμ±νλ
std::hash
νΉμνλ μ 곡ν©λλ€
(μμΈν λ΄μ©μ
μλ
μ°Έμ‘°).
|
νμ€ λΌμ΄λΈλ¬λ¦¬κ° μ 곡νλ λͺ¨λ
|
(C++17λΆν°) |
λΌμ΄λΈλ¬λ¦¬ νμ μ λν νΉμν
μΈμ΄ μ§μ λΌμ΄λΈλ¬λ¦¬ |
|
|
std::coroutine_handle
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
μ§λ¨ λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++11)
|
std::error_code
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++17)
|
std::error_condition
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++11)
|
std::type_index
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
std::stacktrace_entry
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::basic_stacktrace
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
λ©λͺ¨λ¦¬ κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++11)
|
std::unique_ptr
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++11)
|
std::shared_ptr
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++26)
|
std::indirect
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
λ²μ© μ νΈλ¦¬ν° λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++17)
|
std::optional
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++17)
|
std::variant
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++17)
|
std::monostate
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++11)
|
std::bitset
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
컨ν μ΄λ λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++11)
|
std::vector<bool>
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
λ¬Έμμ΄ λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++11)
|
λ¬Έμμ΄μ μν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++17)
(C++17)
(C++20)
(C++17)
(C++17)
|
λ¬Έμμ΄ λ·°μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
ν μ€νΈ μ²λ¦¬ λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++26)
|
std::text_encoding
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
μκ° λΌμ΄λΈλ¬λ¦¬ |
|
|
std::chrono::duration
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::time_point
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
(C++26)
|
std::chrono::day
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++26)
|
std::chrono::month
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++26)
|
std::chrono::year
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
(C++26)
|
std::chrono::weekday
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
std::chrono::weekday_indexed
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::weekday_last
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::month_day
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::month_day_last
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::month_weekday
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::month_weekday_last
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::year_month
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::year_month_day
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::year_month_day_last
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::year_month_weekday
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::year_month_weekday_last
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::zoned_time
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
|
std::chrono::leap_second
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
μ μΆλ ₯ λΌμ΄λΈλ¬λ¦¬ |
|
|
std::filesystem::path
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
|
λμμ± μ§μ λΌμ΄λΈλ¬λ¦¬ |
|
|
(C++11)
|
std::thread::id
μ λν ν΄μ μ§μ
(ν΄λμ€ ν νλ¦Ώ νΉμν) |
μ°Έκ³ μ¬ν
μ€μ ν΄μ ν¨μλ ꡬνμ λ°λΌ λ€λ₯΄λ©° μμμ λͺ μλ κΈ°μ€ μΈμλ λ€λ₯Έ νμ§ κΈ°μ€μ μΆ©μ‘±ν μλ¬΄κ° μμ΅λλ€. νΉν μΌλΆ ꡬνμμλ μ μλ₯Ό μκΈ° μμ μΌλ‘ λ§€ννλ λ¨μν(νλ±) ν΄μ ν¨μλ₯Ό μ¬μ©ν©λλ€. λ€μ λ§ν΄, μ΄λ¬ν ν΄μ ν¨μλ μλ₯Ό λ€μ΄ μνΈν ν΄μκ° μλ λΉμ λ ¬ μ°κ΄ 컨ν μ΄λμ ν¨κ» μλνλλ‘ μ€κ³λμμ΅λλ€.
ν΄μ ν¨μλ νλ‘κ·Έλ¨μ λ¨μΌ μ€ν λ΄μμ λμΌν μ λ ₯μ λν΄ λμΌν κ²°κ³Όλ₯Ό μμ±νκΈ°λ§ νλ©΄ λ©λλ€. μ΄λ₯Ό ν΅ν΄ μΆ©λ κΈ°λ° μλΉμ€ κ±°λΆ κ³΅κ²©μ λ°©μ§νλ μνΈ μ²λ¦¬λ ν΄μκ° κ°λ₯ν΄μ§λλ€.
C λ¬Έμμ΄μ λν νΉμνλ μ‘΄μ¬νμ§ μμ΅λλ€. std :: hash < const char * > λ ν¬μΈν° κ°(λ©λͺ¨λ¦¬ μ£Όμ)μ ν΄μλ₯Ό μμ±νλ©°, λ¬Έμ λ°°μ΄μ λ΄μ©μ κ²μ¬νμ§ μμ΅λλ€.
μΆκ°μ μΈ νΉμνλ€μ
std::pair
λ° νμ€ μ»¨ν
μ΄λ νμ
λ€μ λν΄, κ·Έλ¦¬κ³ ν΄μλ₯Ό ꡬμ±νκΈ° μν μ νΈλ¦¬ν° ν¨μλ€μ΄
boost::hash
μμ μ¬μ© κ°λ₯ν©λλ€.
μμ
#include <cstddef> #include <functional> #include <iomanip> #include <iostream> #include <string> #include <unordered_set> struct S { std::string first_name; std::string last_name; bool operator==(const S&) const = default; // C++20λΆν° }; // C++20 μ΄μ // bool operator==(const S& lhs, const S& rhs) // { // return lhs.first_name == rhs.first_name && lhs.last_name == rhs.last_name; // } // 컀μ€ν ν΄μλ λ 립μ μΈ ν¨μ κ°μ²΄μΌ μ μμ΅λλ€. struct MyHash { std::size_t operator()(const S& s) const noexcept { std::size_t h1 = std::hash<std::string>{}(s.first_name); std::size_t h2 = std::hash<std::string>{}(s.last_name); return h1 ^ (h2 << 1); // λλ boost::hash_combine μ¬μ© } }; // std::hashμ 컀μ€ν νΉμνλ std λ€μμ€νμ΄μ€μ μ£Όμ λ μ μμ΅λλ€. template<> struct std::hash<S> { std::size_t operator()(const S& s) const noexcept { std::size_t h1 = std::hash<std::string>{}(s.first_name); std::size_t h2 = std::hash<std::string>{}(s.last_name); return h1 ^ (h2 << 1); // λλ boost::hash_combine μ¬μ© } }; int main() { std::string str = "Meet the new boss..."; std::size_t str_hash = std::hash<std::string>{}(str); std::cout << "hash(" << std::quoted(str) << ") =\t" << str_hash << '\n'; S obj = {"Hubert", "Farnsworth"}; // λ 립μ μΈ ν¨μ κ°μ²΄ μ¬μ© std::cout << "hash(" << std::quoted(obj.first_name) << ", " << std::quoted(obj.last_name) << ") =\t" << MyHash{}(obj) << " (MyHash μ¬μ©) λλ\n\t\t\t\t" << std::hash<S>{}(obj) << " (μ£Όμ λ νΉμν μ¬μ©)\n"; // 컀μ€ν ν΄μλ₯Ό μ¬μ©νλ©΄ 컀μ€ν νμ μ λΉμ λ ¬ 컨ν μ΄λμμ μ¬μ©ν μ μμ΅λλ€. // μ΄ μμ λ μμμ μ£Όμ λ std::hash<S> νΉμνλ₯Ό μ¬μ©νλ©°, // MyHashλ₯Ό λμ μ¬μ©νλ €λ©΄ λ λ²μ§Έ ν νλ¦Ώ μΈμλ‘ μ λ¬νμμμ€. std::unordered_set<S> names = {obj, {"Bender", "Rodriguez"}, {"Turanga", "Leela"}}; for (auto const& s: names) std::cout << std::quoted(s.first_name) << ' ' << std::quoted(s.last_name) << '\n'; }
κ°λ₯ν μΆλ ₯:
hash("Meet the new boss...") = 10656026664466977650
hash("Hubert", "Farnsworth") = 12922914235676820612 (using MyHash) λλ
12922914235676820612 (using injected specialization)
"Bender" "Rodriguez"
"Turanga" "Leela"
"Hubert" "Farnsworth"
κ²°ν¨ λ³΄κ³ μ
λ€μμ λμ λ³κ²½ κ²°ν¨ λ³΄κ³ μλ€μ μ΄μ μ λ°νλ C++ νμ€μ μκΈ μ μ©λμμ΅λλ€.
| DR | μ μ© λμ | κ²μλ λμ | μ¬λ°λ₯Έ λμ |
|---|---|---|---|
| LWG 2119 | C++11 | νμ₯ μ μνμ λν νΉμνκ° λλ½λ¨ | μ κ³΅λ¨ |
| LWG 2148 | C++11 | μ΄κ±°νμ λν νΉμνκ° λλ½λ¨ | μ κ³΅λ¨ |
| LWG 2543 | C++11 |
std::hash
κ° SFINAE-friendly νμ§ μμ μ μμ
|
SFINAE-friendly νκ² λ³κ²½λ¨ |
| LWG 2817 | C++11 | std::nullptr_t μ λν νΉμνκ° λλ½λ¨ | μ κ³΅λ¨ |