如何专门针对size_t以外的返回类型来专业呼叫操作员
how to specialize std::hash call operator for return types other than 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上提供==
。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使用Sfinae为容器创建模板功能,并根据操作员推断返回类型
- 如何专门针对size_t以外的返回类型来专业呼叫操作员