C++标准库头文件<functional>中提供了对int、double、string等类型的hash支持,但是使用unordered_map和unordered_set这类底层原理为hash表的数据结构往往需要自定义hash函数,尤其是对于数组、vetcor这类线性表。今天在stackoverflow上看到相关讨论,特此记录一下。
- 可以使用boost库中的hash_combine()函数
- hash_combine的实际实现参照如下,按照这个模板自定义线性表类hash函数,性能比较好。
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t seed = vec.size();
for(auto& i : vec) {
seed ^= i + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
return seed;
}