我有一个叫做Point的结构体,Point非常简单:
struct Point
{
Row row;
Column column;
// some other code for addition and subtraction of points is there too
}
Row
和Column
本质上是增强的int
,但我厌倦了无意中将输入参数转换为函数,并给它们每个一个包装器类。
目前我使用一组点的set
,但重复查找实际上会减慢速度。我想要切换到unordered_set
。
所以,我想要有一个Point
的unordered_set
。通常这个集合可能包含比如80x24终端上的每个点= 1920个点。我需要一个好的哈希函数。我刚刚想出了以下内容:
struct PointHash : public std::unary_function<Point, std::size_t>
{
result_type operator()(const argument_type& val) const
{
return val.row.value() * 1000 + val.col.value();
}
};
然而,我不确定这是否是一个好的哈希函数。我需要一个快速的函数,因为我需要非常快速地进行许多查找。有更好的哈希函数可以使用吗,还是这个可以吗?
val.row.value() * 1000
是否大于val.column.value()
并不重要,因为这是哈希码,计算的唯一原因是将点放置在哈希表中的随机位置。有重叠和类似的情况可以帮助事情更顺利。 - Ken Bloomval.row.value() << (10 + val.col.value())
(这将是一个非常糟糕的哈希函数,因为大多数值在取模后都会映射到桶0)。这就是为什么不建议混合位运算和算术运算,以及为什么总体上不建议过早地进行优化。 - Ken Bloom