【发布时间】:2018-02-05 10:39:50
【问题描述】:
我希望生成一个boost::dynamic_bitset 哈希,以便我可以将值存储在boost::bimaps 中。我尝试了以下代码,Test code here.
#include <iostream>
#include <boost/dynamic_bitset.hpp>
#include <unordered_map>
#include <boost/bimap.hpp>
#include <boost/bimap/unordered_set_of.hpp>
#include <boost/bimap/unordered_multiset_of.hpp>
#include <boost/bimap/set_of.hpp>
#include <boost/bimap/multiset_of.hpp>
#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);
}
}
namespace bimaps = boost::bimaps;
typedef boost::bimap<bimaps::unordered_set_of<unsigned long long int>,
bimaps::unordered_multiset_of<size_t> > bimap_reference;
typedef bimap_reference::value_type position;
bimap_reference reference_index_vector;
int main()
{
std::string str = "1011010001101101000001101101000011111111011010000011011010000111111111110110100011011010000011011010000111111110110100000110110100001111111111";
boost::dynamic_bitset<> bits = boost::dynamic_bitset<> (str);
std::cout << "bitmap " << bits << std::endl;
std::cout << "Number of bits " << bits.count() << std::endl;
size_t hash1 = boost::hash_value (bits);
std::cout << "Hash value " << hash1 << std::endl;
/* Insert hash value in bimap
*
*/
// reference_index_vector.insert(position(10000000000, hash1));
// for( bimap_reference::const_iterator iter = reference_index_vector.begin(), iend = reference_index_vector.end();
// iter != iend; ++iter ) {
// std::cout << iter->left << " <--> "<< iter->right <<std::endl;
// }
return 0;
}
我得到了错误
在 /usr/include/boost/dynamic_bitset.hpp:15:0 中包含的文件中,从 3 开始:在 'std::size_t boost::hash_value(const boost::dynamic_bitset&) 的实例化中 [with B = long unsigned诠释; A = std::分配器; std::size_t = long unsigned int]': 34:40: 从这里需要 /usr/include/boost/dynamic_bitset/dynamic_bitset.hpp:422:17: 错误: 'boost::dynamic_bitset::buffer_type boost:: dynamic_bitset::m_bits' 是私有 buffer_type m_bits; ^ 16:37:错误:在此上下文中
不知道出了什么问题。
- 如何散列
boost::dynamic_bitset - 如何将哈希转换回原始位集。
- 所需的总空间(计数为 0 和 1 或仅 1)。以上代码仅由
bits.count()显示 80 位。我尝试了以下方法来生成哈希值,但不确定需要多少空间。
另外,我尝试通过以下代码生成bitset的哈希值
/*Generating hash by bitset
*
*/
std::bitset<142> seq (str);
std::hash<std::bitset<142>> hash_bitset;
std::cout << "Bitset " << seq << std::endl;
std::cout << "Hash value " << hash_bitset(seq) << std::endl;
#Bitset 1011010001101101000001101101000011111111011010000011011010000111111111110110100011011010000011011010000111111110110100000110110100001111111111
#Hash value 4886653603414440856
【问题讨论】: