std :: hash <boost :: posix_time :: ptime> </boost :: posix_time :: ptime>的函数

时间:2015-03-13 05:36:08

标签: c++ boost stdhash

我想知道计算哈希的最佳方法是什么,考虑到用作键的ptime的值主要在小时和日期(分钟和秒通常为0)上有所不同。 / p>

我已经做到了这一点,但我觉得它非常丑陋和缓慢:

namespace std
{
    /**
     * Specialize std::hash for ptime
     */
    template<>
    class hash<boost::posix_time::ptime>
    {
    public:
        size_t operator()(const boost::posix_time::ptime& t) const
        {
            const auto dt = t.date();
            const auto ho = t.time_of_day().hours();
            return hash<int>()(dt.day_number()) ^ hash<int>()(ho);
        }
    };
}

1 个答案:

答案 0 :(得分:4)

您应该关注的关键字是&#34; avalanche effect&#34;和#34;哈希结合&#34;。

您可能不应该自己设计哈希函数,因为这个领域已经过彻底的研究和研究。只需选择具有良好雪崩效应的功能,例如MurmurHash

由于您已经在使用提升功能,boost::hash_combine可能是最适合您的解决方案(also mentioned here):

friend std::size_t hash_value(point const& p)
{
    std::size_t seed = 0;
    boost::hash_combine(seed, p.x);
    boost::hash_combine(seed, p.y);
    return seed;
}

更重要的是,您可以使用类似total_nanoseconds()的内容,甚至可以使用内部系统类型并使用该值进行散列,而不是使用day_number和小时,从而避免在转换实时时间戳时减少人为范围到几天/几小时。