哈希和访问

Hashing and access

本文关键字:访问 哈希      更新时间:2023-10-16

我想为我的对象使用散列存储。这真的比std::map<std::string, Object>快吗?我是说搜索。据我所知,boost处理了很多优化。

我不确定我的代码是否正确。当搜索/插入等时,它真的使用散列键吗?

using boost::multi_index_container;
using namespace boost::multi_index;
struct Object
{
  std::string name;
  Object(std::string name_): name(name_) {}
};
typedef multi_index_container<
  Object,
  indexed_by<
    hashed_unique<
      BOOST_MULTI_INDEX_MEMBER(Object, std::string, name)
    >
  >
> ObjectSet;
ObjectSet objects;
objects.insert(Object("test1"));
objects.insert(Object("test2"));
objects.insert(Object("test3"));
// And testing:
objects.find("test2");

当你只有一个键时,为什么你使用Boost多索引容器?如果您不打算很快添加更多的键,您应该只使用std::unordered_mapstd::map

对于哈希表和树:

例如,unordered_map的GCC实现从不收缩它的表,所以如果您添加了很多元素,然后删除了其中的大部分,那么您将得到一些具有非常糟糕的数据局部性的东西(因此w.r.t.缓存的性能很差)。从算法上讲,哈希表可能很吸引人,但在实际运行的系统中,它们的性能可能比树更差,特别是当元素数量为数百或更少时。

精确匹配查找,除了最极端的退化情况,在unordered_map (hash_map)中使用散列键比在std::map的底层红黑树中更快。

是的,你的代码应该是正确的,假设有一个散列函数接受std::string并返回其内容的散列。