这是我第一次尝试使用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上提供==
。