.
#define BOOST_DYNAMIC_BITSET_DONT_USE_FRIENDS
namespace boost {
template <typename B, typename A>
std::size_t hash_value(const boost::dynamic_bitset<B, A>& bs) {
return boost::hash_value(bs.m_bits);
}
}
boost::dynamic_biset<> test(1,false);
auto hash1 = boost::hash_value(test);
test.push_back(false);
auto hash2 = boost::hash_value(test);
test.push_back(false);
auto hash31 = boost::hash_value(test);
-.
dynamic_bitset, , , dynamic_bitset vector<bool>. , dynamic_bitset<> test(1, false), dynamic_bitset 4 ( 1). : 32, 4 dynamic_bitsets<>::m_bits ( m_bits - 4 ).
test.push_back(x), x 2. x - false, m_bits[0] ! , m_num_bits -.
: ?
1: use boost::hash_combine
This approach is simple and simple. I did not check this compiler or not.
namespace boost {
template <typename B, typename A>
std::size_t hash_value(const boost::dynamic_bitset<B, A>& bs) {
size_t tmp = 0;
boost::hash_combine(tmp,bs.m_num_bits);
boost::hash_combine(tmp,bs.m_bits);
return tmp;
}
}
2: flip m_num_bits% bits_per_block th bits. flip the bits according to the size of the bits. I believe this approach is faster than 1.
namespace boost {
template <typename B, typename A>
std::size_t hash_value(const boost::dynamic_bitset<B, A>& bs) {
auto bit = 1u << (bs.m_num_bits % bs.bits_per_block);
auto return_val = boost::hash_value(bs.m_bits);
return (return_val & bit) ? return_val & (~bit) : return_val | bit;
}
}
source
share