c++ - `std::vector` 的快速哈希函数

标签 c++ c++11 vector hash

我实现了此解决方案以从 vector<T> 获取哈希值:

namespace std
{
    template<typename T>
    struct hash<vector<T>>
    {
        typedef vector<T> argument_type;
        typedef std::size_t result_type;
        result_type operator()(argument_type const& in) const
        {
            size_t size = in.size();
            size_t seed = 0;
            for (size_t i = 0; i < size; i++)
                //Combine the hash of the current vector with the hashes of the previous ones
                hash_combine(seed, in[i]);
            return seed;
        }
    };
}

//using boost::hash_combine
template <class T>
inline void hash_combine(std::size_t& seed, T const& v)
{
    seed ^= std::hash<T>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}

但这个解决方案根本无法扩展:使用 vector<double> 1000 万个元素需要超过 2.5 秒(根据 VS)。

是否存在针对这种情况的快速哈希函数?

请注意,从 vector 引用创建哈希值不是可行的解决方案,因为相关的 unordred_map将在不同的运行中使用,此外还有两个 vector<double>内容相同但地址不同的映射方式不同(此应用程序的不良行为)。

最佳答案

注意: As per the comments ,您可以通过优化编译获得 25-50 倍的加速。这样做,首先。 然后,如果还是太慢,请看下面。


我认为您无能为力。您必须触摸所有元素,并且该组合函数的速度与它得到的一样快。

一个选项可能是并行化哈希函数。如果您有 8 个核心,则可以运行 8 个线程来对 vector 的每个哈希 1/8 进行处理,然后在最后组合 8 个结果值。对于非常大的 vector ,同步开销可能是值得的。

关于c++ - `std::vector` 的快速哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37007307/

相关文章:

c++ - 这是返回迭代器元素和后增量的有效方法吗?

c++ - Unicode 与 MSVC++ 2012

c++ - 在带有 boost::function 的 std::for_each 中使用 boost.lambda

c++ - 用计数器扩展参数包

c++ - 从多态指针检查类成员是否存在?

c++ - 在 Fedora 14 上编译 C++ 程序时出现编译错误

c++ - static_cast 文字 0 到 STL 中的其他类型

c - C99 中的 HashTable 和 Vector-like 数据结构

c++ - 为什么我不能通过推回将值存储在我的 2D vector 中?

C++: std::vector - "slice"一个 vector 是可能的吗?