C++ std::hash的函子
我想知道计算散列的最佳方法是什么,因为用作键的ptime值的差异主要体现在小时和日期分钟和秒通常为0 我这样做了,但我觉得这是相当丑陋和缓慢的: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
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;
}