std::hash<boost::posix_time::ptime> 的函子

Functor for std::hash<boost::posix_time::ptime>

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

我做了这个但是我觉得它很丑而且很慢:

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);
        }
    };
}

您应该查看的关键字是“avalanche effect”和"hash combine"。

你可能不应该自己设计散列函数,因为这个领域已经被彻底研究和研究过。选择雪崩效果好的函数即可,例如MurmurHash.

由于您已经在使用 boost,boost::hash_combine might be the most appropriate and useful solution for you (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 和小时,甚至可以使用内部系统类型并使用该值进行散列,避免人为缩小范围当您将真实时间戳转换为 days/hours.