basic_string_view_hash

basic_string_view_hash (basic_string_view 해시)

이 페이지는 C++ 표준 라이브러리의 std::hash 템플릿 특수화가 std::string_view 계열 타입에 대해 어떻게 동작하는지 설명해요. 이 특수화들은 문자열 뷰를 해시 가능한 객체로 만들어 주며, std::unordered_set이나 std::unordered_map 같은 해시 기반 컨테이너에서 문자열 뷰를 사용할 수 있게 해줘요. 또한 이 해시 값은 대응하는 std::basic_string 타입의 해시 값과 동일해요.

출처: cppreference

본문

정의

<string_view> 헤더에 다음과 같은 std::hash 특수화가 정의돼 있어요.

<string_view> 헤더에 정의됨
template <> struct hash<std::string_view>; (C++17부터)
template <> struct hash<std::wstring_view>; (C++17부터)
template <> struct hash<std::u8string_view>; (C++20부터)
template <> struct hash<std::u16string_view>; (C++17부터)
template <> struct hash<std::u32string_view>; (C++17부터)

이 특수화들은 문자열 뷰를 해싱하기 위한 다양한 뷰 클래스에 대해 제공돼요.

이 해시들은 대응하는 std::basic_string 클래스들의 해시와 같아요. 만약 S가 표준 basic_string 타입 중 하나이고, SV가 그에 대응하는 문자열 뷰 타입이며, sS 타입의 객체라면, std::hash<S>()(s) == std::hash<SV>()(SV(s))가 성립해요.

예제

#include <iostream>
#include <string_view>
#include <unordered_set>
using namespace std::literals;

int main()
{
    std::cout << "\"A\"   #: " << std::hash<std::string_view>{}("A"sv) << '\n';
    std::cout << "L\"B\"  #: " << std::hash<std::wstring_view>{}(L"B"sv) << '\n';
    std::cout << "u8\"C\" #: " << std::hash<std::u8string_view>{}(u8"C"sv) << '\n';
    std::cout << "u\"D\"  #: " << std::hash<std::u16string_view>{}(u"D"sv) << '\n';
    std::cout << "U\"E\"  #: " << std::hash<std::u32string_view>{}(U"E"sv) << '\n';

    // std::hash for string_view family makes it possible to keep these view-types
    // in unordered_* associative containers, such as unordered_set. But ensure
    // the lifespan of referenced strings is no less than lifespan of the container,
    // i.e. no dangling references occurred.

    std::unordered_set stars{"Rigel"sv, "Capella"sv, "Vega"sv, "Arcturus"sv};

    for (std::string_view const& s : stars)
        std::cout << s << ' ';
    std::cout << '\n';
}

가능한 출력:

"A"   #: 6919333181322027406
L"B"  #: 11959850520494268278
u8"C" #: 12432341034569643010
u"D"  #: 312659256970442235
U"E"  #: 18073225910249204957
Arcturus Vega Capella Rigel

같이 보기

hash (C++11) 해시 함수 객체 (클래스 템플릿) [편집]
std::hashstd::basic_string (C++11) 문자열에 대한 해시 지원 (클래스 템플릿 특수화) [편집]

더 알아보기 (Learn more)

cppreference