为什么没有提升:: hash_value默认支持boost :: unordered_set?

时间:2013-11-18 03:09:49

标签: c++ boost

看起来很直观,人们应该能够使用集合,而且std::set的设计默认是支持这种使用(因为默认情况下会执行词典排序。)同样,期望boost::unordered_set的相同功能。有没有一个很好的理由为什么在默认情况下boost不会为boost::unordered_set实现广义哈希函数,例如:

// DEFINE A HASH FUNCTION FOR A HASH-SET THAT COMBINES THE HASH VALUES
// OF THE ELEMENTS OF THAT SET
namespace boost {
    template<typename T>
    size_t hash_value(const boost::unordered_set<T> & set) {
        typename boost::unordered_set<T>::const_iterator it, itend;
        size_t seed = 0;
        for ( it = set.begin(), itend = set.end(); it != itend; it++ ){
            boost::hash_combine(seed,boost::hash_value(*it));
        }
        return seed;
    }
}

1 个答案:

答案 0 :(得分:2)

一般来说,你希望哈希是快速的,理想情况下是恒定时间。

string上,你可以做的一件事是得到长度,然后只在其长度上采样X次(假设非病理输入,将相当好地避免碰撞)。

unordered_set缺少get_nth,这将允许类似的策略将散列时间保持在O(1)。或者,unordered_set可以保留其内容的散列的xor并将其用作自己的散列(而不是hash_combine,因为它依赖于顺序,并且当有100时,很难从组合散列中删除第3个元素他们在O(1)时间。)

缺乏良好的O(1)实现,默认情况下公开hash_value对于unordered_set<unordered_set<foo>>的构建者来说似乎过于鼓励,实际上他们应该写unordered_set< my_unordered_set_wrapper<foo> >,其中unordered_set_wrapper 1}}做上面的“xor of contents hashs”来产生O(1)hash_value。要么是,要么扩展unordered_set

至于为什么boost 实际没有包含它,你必须要求所有向boost集体添加内容的人。它们似乎不存在。