Spec-Zone.ru › C++

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

Определено в заголовке <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 - указатель, следующий за концом последовательности для хеширования

Возвращаемое значение

Значение хэша, соответствующее порядку сортировки.

Примечание

Предоставленные системой локализованные наборы правил обычно не сортируют две строки как эквивалентные (compare() не возвращает ​0​) если basic_string::operator== возвращает false, но установленный пользователем локализованный набор правил может предоставлять разные правила сортировки, например, он может рассматривать строки как эквивалентные, если у них одинаковая нормализованная форма Юникода.

Пример

Демонстрирует контейнер без упорядочивания, чувствительный к локализованным наборам правил.

#include <iostream>
#include <locale>
#include <string>
#include <unordered_set>
 
struct CollateHash
{
    template<typename CharT>
    long 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::basic_string>
(C++11)
поддержка хэширования для строк
(специализация шаблона класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/collate/hash

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API