- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我第一次尝试使用 std::unordered_map
,c++17。我正在尝试构建一个快速的 LRU
,我将 sha1
摘要映射到数据 block 。我的 sha1
对象是完全可比较的等等,但是当我尝试实例化 map 时,我得到这个错误:
/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
)是唯一的。它假定键是。如果哈希良好,它会表现良好。
无序映射使用size_t
来确定将数据放入哪个桶。它可以很好地处理 size_t
空间中的碰撞。
根据需要将 sha HashMap 到 size_t
,并使用 sha 哈希作为 key 。在不太可能发生的情况下,您会遇到 size_t
散列冲突(当您在无序映射中有大约 40 亿个元素时,假设散列良好,则为 50/50 - 请参阅数学的“生日悖论”,或者更常见的是较小的哈希表;它会动态地增加表)它会依赖于你的 sha 哈希键的相等性来避免“真正的”冲突。
有多种碰撞。
除非您的大部分数据 maos 具有相同的 size_t,否则该 map 有损是完全没问题的。您只需担心第一种碰撞,并在您的 sha-hashes 上提供 ==
。
关于c++ - 如何为 size_t 以外的返回类型专门化 std::hash 调用运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55265221/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!