# std::collate<CharT>::hash, std::collate<CharT>::do_hash

< cpp‎ | locale‎ | collate

定义于头文件 `<locale>` |  |
public: long hash( const CharT* beg, const CharT* end ) const; | (1) |
protected: virtual long do_hash( const CharT* beg, const CharT* end ) const; | (2) |

1) 公开成员函数，调用最终导出类的受保护虚成员函数 `do_hash` 。
2) 转换字符序列 `[beg, end)` 为整数值，该值对所有此本地环境中对照等价（ compare() 返回 ​0​ ）的字符串相同。对于二个不对照等价的字符串，其哈希相等的概率要非常小，近似 1.0/std::numeric_limits<unsigned long>::max() 。

### 参数

beg | - | 指向要哈希的序列中首字符的指针
end | - | 要哈西的序列的尾后一位置指针

### 返回值

相对于对照顺序的哈希值。

### 注意

若 `basic_string::operator==` 返回 false ，则系统提供的本地环正常地不对照二个字符串为等价（ compare() 不返回 ​0​ ），但用户安装的 std::collate 平面可提供不同的对照规则，例如，它可以若字符串拥有相同的 Unicode 正常化形式，则对待字符串为等价。

### 示例

演示具本地环境的无序容器

    #include <iostream>
    #include <string>
    #include <locale>
    #include <unordered_set>

    struct CollateHash {
        template<typename CharT>
        std::size_t operator()(const std::basic_string<CharT>& s) const
        {
            return std::use_facet<std::collate<CharT>>(std::locale()).hash(
                       &s[0], &s[0] + s.size()
                   );
        }
    };
    struct CollateEq {
        template<typename CharT>
        bool operator()(const std::basic_string<CharT>& s1,
                        const std::basic_string<CharT>& s2) const
        {
            return std::use_facet<std::collate<CharT>>(std::locale()).compare(
                         &s1[0], &s1[0] + s1.size(),
                         &s2[0], &s2[0] + s2.size()
                   ) == 0;
        }
    };

    int main()
    {
        std::locale::global(std::locale("en_US.utf8"));
        std::wcout.imbue(std::locale());

        std::unordered_set<std::wstring, CollateHash, CollateEq> s2 = {L"Foo", L"Bar"};
        for(auto& str: s2)
            std::wcout << str << ' ';
        std::cout << '\n';
    }

可能的输出：

    Bar Foo

### 参阅

std::hash<std::string>std::hash<std::u8string>std::hash<std::u16string>std::hash<std::u32string>std::hash<std::wstring>std::hash<std::pmr::string>std::hash<std::pmr::u8string>std::hash<std::pmr::u16string>std::hash<std::pmr::u32string>std::hash<std::pmr::wstring> (C++11)(C++20)(C++11)(C++11)(C++11)(C++17)(C++20)(C++17)(C++17)(C++17) | string 的散列支持 (类模板特化)