C++ std::hash的函子

C++ std::hash的函子,c++,boost,stdhash,C++,Boost,Stdhash,我想知道计算散列的最佳方法是什么,因为用作键的ptime值的差异主要体现在小时和日期分钟和秒通常为0 我这样做了,但我觉得这是相当丑陋和缓慢的: namespace std { /** * Specialize std::hash for ptime */ template<> class hash<boost::posix_time::ptime> { public: size_t operat

我想知道计算散列的最佳方法是什么,因为用作键的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);
        }
    };
}

您应该查找的关键字是和哈希组合

您可能不应该自己设计散列函数,因为这方面已经进行了深入的研究。只需选择具有良好雪崩效果的函数,例如

由于您已经在使用boost,因此可能是最合适、最有用的解决方案:


更重要的是,您可以使用total_nanoseconds之类的值,而不是使用day_数和hours,甚至可以使用内部系统类型并使用该值进行哈希运算,从而避免在将实际时间戳转换为days/hours时人为范围减小。

您应该查找的关键字是和哈希组合

您可能不应该自己设计散列函数,因为这方面已经进行了深入的研究。只需选择具有良好雪崩效果的函数,例如

由于您已经在使用boost,因此可能是最合适、最有用的解决方案:


更重要的是,您可以使用total_nanoseconds,而不是day_number和hours,甚至可以使用内部系统类型,并使用该值进行哈希运算,避免在将实际时间戳转换为days/hours时人为范围的减小。

total_nanoseconds不是time_duration-不是ptime吗?因此,只能从每天的某个时间获取,不是吗?没错,我在文档中查看了错误的段落。但是你得到了这样的想法:最好将散列输入范围扩展到毫秒或滴答声,这样输出就可以更好地分布。从时间到持续时间的总时间不是纳秒吗?不是ptime吗?因此,只能从每天的某个时间获取,不是吗?没错,我在文档中查看了错误的段落。但您得到了这样的想法:最好将散列输入范围扩展到毫秒或滴答之类的值,以便更好地分布输出。
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;
}