<boost::hash>выполняется путем вызова функции<hash_value>. Пространство имен не указано, чтобы оно могло обнаруживать перегрузки с помощью поиска, зависящего от аргумента. Таким образом, если есть бесплатная функция<hash_value>в том же пространстве имен, что и пользовательский тип, она будет называться.
Если у вас есть структура<library::book>, где каждый<book>однозначно определен его членом<id>:
namespace library
{
    struct book
    {
        int id;
        std::string author;
        std::string title;
        
    };
    bool operator==(book const& a, book const& b)
    {
        return a.id == b.id;
    }
}
Тогда все, что вам нужно сделать, это написать функцию<library::hash_value>:
namespace library
{
    std::size_t hash_value(book const& b)
    {
        boost::hash<int> hasher;
        return hasher(b.id);
    }
}
Теперь вы можете использовать<boost::hash>с книгой:
library::book knife(3458, "Zane Grey", "The Hash Knife Outfit");
library::book dandelion(1354, "Paul J. Shanley",
    "Hash & Dandelion Greens");
boost::hash<library::book> book_hasher;
std::size_t knife_hash_value = book_hasher(knife);
std::unordered_set<library::book, boost::hash<library::book> > books;
books.insert(knife);
books.insert(library::book(2443, "Lindgren, Torgny", "Hash"));
books.insert(library::book(1953, "Snyder, Bernadette M.",
    "Heavenly Hash: A Tasty Mix of a Mother's Meditations"));
assert(books.find(knife) != books.end());
assert(books.find(dandelion) == books.end());
Полный пример можно найти в:/libs/functional/hash/examples/books.hppи/libs/functional/hash/examples/books.cpp.
| ![[Tip]](/img/tip.png) | Tip | 
| При написании хеш-функции сначала посмотрите, как работает функция равенства. Равные объекты должны генерировать одно и то же хеш-значение. Когда объекты не равны, они должны генерировать различные значения хэша. В этом объекте равенство было основано только на id, поэтому хеш-функция только хеширует id. Если он был основан на названии объекта и авторе, то хеш-функция должна учитывать их (как это сделать обсуждается в следующем разделе). |