我想知道计算哈希的最佳方法是什么,考虑到用作键的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);
}
};
}
答案 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和小时,从而避免在转换实时时间戳时减少人为范围到几天/几小时。