【发布时间】:2016-06-20 07:19:14
【问题描述】:
我有一个自定义结构,它包含 12 个整数值,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6。
数字的范围在 1 和 5 之间,每个结构都保证有不同的组合,即 NO 两个结构可以具有 x1,y1,x2,y2,x3 的所有值, y3,x4,y4,x5,y5,x6,y6 与 other 各自的值相同。
我需要一个好的散列函数来执行 O(1) 操作。
要求是找出具有特定 x1,y1....x6,y6 值的结构
现在我正在使用以下内容:-
struct Hash_6
{
size_t operator () ( const Node& n ) const
{
int result=17;
result=31*result+n.x1;
result=31*result+n.x2;
result=31*result+n.x3;
result=31*result+n.x4;
result=31*result+n.x5;
result=31*result+n.x6;
result=31*result+n.y1;
result=31*result+n.y2;
result=31*result+n.y3;
result=31*result+n.y4;
result=31*result+n.y5;
result=31*result+n.y6;
return result;
}
};
我想知道是否有任何更好更有效的哈希函数可以用于这种特定情况。
【问题讨论】:
-
如果值在 1-5 之间,为什么不使用 5*result 而不是 31? 5^12 非常适合 32 位 int,并且会为您提供每个组合的唯一哈希值,因此在您对哈希桶宽度取模后,简单的哈希比较会告诉您是否有完全匹配。
-
其实我对哈希函数的了解低于平均水平,所以这是我在大多数程序中使用的哈希函数
-
我一定会尝试使用 5 并返回。谢谢
标签: c++11 hash hashcode unordered-set custom-data-type