Все типы в этой библиотеке поддерживают хеширование через boost::hash или std::hash. Это означает, что мы можем использовать многоточные типы непосредственно в хешированных контейнерах, таких как std::unordered_set:
using namespace boost::multiprecision;
using namespace boost::random;
mt19937 mt;
uniform_int_distribution<uint256_t> ui;
std::unordered_set<uint256_t> set;
for(unsigned i = 0; i < 1000; ++i)
set.insert(ui(mt));
Или мы можем определить нашу собственную хеш-функцию, например, в этом случае на основе Google CityHash:
struct cityhash
{
std::size_t operator()(const boost::multiprecision::uint256_t& val)const
{
std::size_t result = CityHash64(reinterpret_cast<const char*>(val.backend().limbs()), val.backend().size() * sizeof(val.backend().limbs()[0]));
return val < 0 ? ~result : result;
}
};
Как и прежде, вставьте некоторые значения в контейнер, на этот раз используя наш пользовательский хэшер:
std::unordered_set<uint256_t, cityhash> set2;
for(unsigned i = 0; i < 1000; ++i)
set2.insert(ui(mt));