std::collate::hash, std::collate::do_hash

< cpp‎ | locale‎ | collate
Revision as of 10:36, 19 February 2013 by Cubbi (Talk | contribs)

Template:ddcl list begin <tr class="t-dsc-header">

Defined in header <locale>

<td></td> <td></td> <tr class="t-dcl ">

<td >
long hash( const CharT* beg, const CharT* end ) const;

<td > (1) </td> <td class="t-dcl-nopad"> </td> </tr> <tr class="t-dcl ">

<td >
virtual long do_hash( const CharT* beg, const CharT* end ) const;

<td > (2) </td> <td class="t-dcl-nopad"> </td> </tr> Template:ddcl list end

1) public member function, calls the protected virtual member function do_hash of the most derived class.

2) Converts the character sequence [beg, end) to an integer value that is equal to the hash obtained for all strings that collate equivalent in this locale (Template:rlpf returns 0). For two strings that do not collate equivalent, the probability that their hashes are equal should be very small, approaching 1.0/std::numeric_limits<unsigned long>::max().



beg - pointer to the first character in the sequence to hash
end - one past the end pointer for the sequence to hash

Return value

The hash value that respects collation order


The system-supplied locales normally do not collate two strings as equivalent (Template:rlpf does not return 0) if basic_string::operator== returns false, but a user-installed std::collate facet may provide different collation rules, for example, it may treat strings as equivalent if they have the same Unicode normalized form.


Demonstrates a locale-aware unordered container

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

Possible output:

Bar Foo

See also

Template:cpp/string/basic string/dcl list hash