如何专门针对size_t以外的返回类型来专业呼叫操作员



这是我第一次尝试使用std::unordered_map,C 17。我正在尝试构建一个快速的LRU,其中我将sha1摘要映射到数据块。我的sha1对象是完全可比的,但是当我尝试实例化地图时,我会得到此错误:

/usr/include/c++/7/bits/hashtable_policy.h:87:34: error: no match for call to ‘(const std::hash<
kbs::crypto::basic_digest<20,kbs::crypto::openssl_sha1_digest_engine_policy> >) (const kbs::crypto::basic_digest<20, kbs::crypto::openssl_sha1_digest_engine_policy>&)’
  noexcept(declval<const _Hash&>()(declval<const _Key&>()))>

因此,我可以为用户定义的类型专门使用std::hash。但是,它总是返回size_t,这很糟糕,从20个字节到8个字节却击败了将SHA1用于Hash_key的目的。

有没有办法解决这个问题?替代容器?必须写自己的hashmap是浪费。我想我可以使用std:set ...

无序地图不假定哈希( size_t s)是唯一的。它假设钥匙是。如果哈希为 good

,它的性能很好

无序地图使用size_t来确定将数据放入哪个存储桶中。它处理size_t空间中的碰撞。

根据需要将您的sha哈希映射到 size_t,并将sha hash用作钥匙。在不太可能的情况下,您会得到size_t哈希碰撞(50/50当您在无序地图中大约有40亿个元素时,假设良好的哈希 - 请参阅数学的"生日悖论",或者更频繁地使用较小的哈希表;它动态增长表)将依靠您的sha哈希键的平等来避免"真实"碰撞。

有多种碰撞。

  • sha-hash碰撞:糟糕,是指相同的关键不同数据。
  • size_t哈希碰撞:meh,意味着这两个元素将始终在同一桶中。
  • 内部哈希表碰撞:常见,意味着在此特定尺寸下,这两个元素在同一桶中。

除非您的大多数数据MAO都达到相同的size_t,否则该地图的损失是完全可以的。您只是担心第一种碰撞,并在您的sha-hashes上提供==

最新更新