【问题标题】:Hash function required for custom data structure containing 12 integers包含 12 个整数的自定义数据结构所需的哈希函数
【发布时间】: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


【解决方案1】:

如果值始终介于 1 到 5 之间,那么您可以获得 32 位值内的唯一哈希。

这是因为 5(值)的 12 次方(变量数)是 244,140,625,一个可以用 28 位表示的值。

因此你的哈希函数变成了(伪代码):

def hasher(s):
    res = s.x1 - 1
    for val in s.x2, s.x3, s.x4, s.x5, s.x6 s.y1, s.y2, s.y3, s.y4, s.y5, s.y6:
        res = res * 5 + val - 1;
    return res

通过您的约束,您可以从该哈希函数中获得唯一值。


如果您想将该哈希用于桶选择(例如在集合或字典中使用),您可能希望使用模数将其减少到更合适的值(在流程中引入冲突)。

但目前尚不清楚您是需要哈希来识别(保持原样)还是分桶(减少它)。如果是后者,并且价值合理地均匀分布,那将是:

bucket_to_use = hasher(item) modulo num_buckets

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多