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.
考虑到用作键的 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.