1

我想知道计算哈希的最佳方法是什么,考虑到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);
        }
    };
}
4

1 回答 1

4

您应该寻找的关键字是“雪崩效应”和“哈希组合”。

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

由于您已经在使用 boost,因此boost::hash_combine可能是对您最合适和最有用的解决方案(这里也提到了):

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

更重要的是,除了使用 day_number 和 hours,您可以使用类似total_nanoseconds()甚至深入到内部系统类型并将该值用于散列,避免在将实际时间戳转换为天/小时时人为范围减少。

于 2015-03-13T06:48:14.223 回答