我想将大约100个非负32位整数的列表压缩成一个整数。理想情况下,结果整数始终是唯一的,但可以接受一些相对罕见的碰撞。 我该怎么做?
我正在写一个拼图解算器。我的搜索算法的一部分是避免重新探索已经看到的谜题状态。我将使用列表中生成的整数作为statesAlreadySeen
表的密钥。目前我正在使用字符串作为键。但是,当我从map<,>
的字符串键变为整数键时,我看到了明显的性能提升,因此我想切换。
修改:感谢您提供无序的地图建议!但是我仍然对实际的散列函数感到好奇。 IIRC有一个简单的功能,涉及基本位操作和xoring。很高兴看到这一点,并对碰撞概率有一些大致的了解。
答案 0 :(得分:2)
根据评论中的建议,您需要使用哈希函数。最容易通过boost::hash_range
完成:
#include <boost/functional/hash.hpp>
std::size_t vectorhash(std::vector<int> f){
size_t hash = std::size_t hash = boost::hash_range(f.begin(), f.end());
}
话虽如此,如果你没有真正需要保持状态的顺序(我不明白为什么你会这样做),我会采用us2012的解决方案来保持string
键并切换到unordered_map
- 因此让容器处理散列。