Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Combining hash values

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 14. Boost.Functional/Hash

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Скажем, у вас есть класс точек, представляющий двухмерное местоположение:

class point
{
    int x;
    int y;
public:
    point() : x(0), y(0) {}
    point(int x, int y) : x(x), y(y) {}
    bool operator==(point const& other) const
    {
        return x == other.x && y == other.y;
    }
};

Вы хотите использовать его в качестве ключа для<unordered_map>. Вы должны настроить хеш для этой структуры. Для этого необходимо объединить значения хеширования для<x>и<y>. Функция<boost::hash_combine>предназначена для этой цели:

class point
{
    ...
    friend std::size_t hash_value(point const& p)
    {
        std::size_t seed = 0;
        boost::hash_combine(seed, p.x);
        boost::hash_combine(seed, p.y);
        return seed;
    }
    ...
};

Призывы к хэш-комбинированию постепенно строят хэш из разных элементов точки, его можно многократно вызывать для любого количества элементов. Он вызывает<hash_value>на поставляемый элемент и соединяет его с семенем.

Полный код для этого примера находится по адресу/libs/functional/hash/examples/point.cpp.

[Note] Note

При использовании<boost::hash_combine>порядок звонков имеет значение.

    std::size_t seed = 0;
    boost::hash_combine(seed, 1);
    boost::hash_combine(seed, 2);

В результате получается другое семя для:

    std::size_t seed = 0;
    boost::hash_combine(seed, 2);
    boost::hash_combine(seed, 1);

Если вы вычисляете значение хэша для данных, где порядок данных не имеет значения в сравнении (например, набор), вы должны убедиться, что данные всегда поставляются в том же порядке.

Для расчета хэша диапазона итераторов можно использовать<boost::hash_range>:

std::vector<std::string> some_strings;
std::size_t hash = boost::hash_range(some_strings.begin(), some_strings.end());

Обратите внимание, что при написании классов шаблонов вы, возможно, не захотите включать основной хеш-заголовок, так как это довольно дорогое включение, которое приносит много других заголовков, поэтому вместо этого вы можете включить заголовок<<boost/functional/hash_fwd.hpp>>, который вперед объявляет<boost::hash>,<boost::hash_range>и<boost::hash_combine>. Вам нужно будет включить основной заголовок перед началом<boost::hash>. При использовании контейнера, который использует<boost::hash>, он должен сделать это для вас, поэтому ваш тип будет хорошо работать с хеш-контейнерами. Примером этого являетсяtemplate.hppиtemplate.cpp.


PrevUpHomeNext

Статья Combining hash values раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 14. Boost.Functional/Hash может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 14. Boost.Functional/Hash ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:47:59/0.0066039562225342/0