Hash 哈希函数与组合多个键

Hash 哈希函数与组合多个键,hash,Hash,我在每个元素中有三个键(两个字符串和一个整数),我想设计一个哈希函数。为了使哈希表统一,我想使用所有三个键。我应该走哪条路 private: string name; int age; string homeTown; 最简单的实现将使用每个字段的密钥总和,如下所示: return fieldA.getHashCode() + fieldB.getHashCode() + fieldC.getHashCode(); 我大部分时间都使用这种方法。然

我在每个元素中有三个键(两个字符串和一个整数),我想设计一个哈希函数。为了使哈希表统一,我想使用所有三个键。我应该走哪条路

private:
    string name; 
    int age;        
    string homeTown;  

最简单的实现将使用每个字段的密钥总和,如下所示:

return fieldA.getHashCode() + fieldB.getHashCode() + fieldC.getHashCode();
我大部分时间都使用这种方法。然而,这并不是最理想的设计,因为关键基数确实对“最独特”的行为有影响。散列键的设计目标很简单——用几个字节获得对象数据的最唯一表示形式,因此如果“fieldA”的逻辑权重更大,那么最好使用某种多项式公式,如:

 a^2 + b*2 + c //where a,b,c are hashes of fields

指数部分产生比线性求和更好的结果,因为它为位置分配了不同的权重,所以在第二个和第三个字段产生相同哈希的情况下,结果仍然会不同

10 + 2 + 18 = 18 + 10 + 2
但是


哈希函数的正确设计并不是一个简单的主题,它涉及概率论。

这缺少很多上下文:语言、字符串大小、字符串/整数的分布?那么我在哪里可以找到关于这一点的算法呢?所有算法都是用一个键设计的。如果速度没有问题,那么使用:a^3+b^2+c您计划有多少记录/实体?您计划多久让它们进入/离开哈希表一次?如果你有一个名单的人,然后只使用他们的SSN。如果我看到您的类声明代码(用于推断其含义/可能的分布的字段名),我会给您更好的建议。实际上,速度非常重要。大约2000人报名。实际上,这是一个家庭作业,他们将根据作业的速度和一致性来给作业评分。我编辑了这个问题,然后用这个:name.getHash()*1000+家乡.getHash()*10+年龄.getHash()。并确保此操作未选中溢出
10 + 2 + 18 = 18 + 10 + 2
10^3 + 2^2 + 18 != 18^3 + 10^2 + 2