我在每个元素中有三个键(两个字符串和一个整数),我想设计一个哈希函数。为了使哈希表统一,我想使用所有三个键。我应该走哪条路?
private:
string name;
int age;
string homeTown;
答案 0 :(得分:1)
最天真的实现将使用每个字段的密钥总和,如下所示:
return fieldA.getHashCode() + fieldB.getHashCode() + fieldC.getHashCode();
我大部分时间都使用这种方法。然而,由于关键基数确实影响“最独特”的行为,因此这不是最优化的设计。散列键的设计目标很简单 - 用几个字节获得对象数据的最独特表示,所以如果“fieldA”具有更多逻辑权重,那么你最好使用某种多项式公式,如:
a^2 + b*2 + c //where a,b,c are hashes of fields
OR
a^3 + b^2 + c ^1
指数部分产生比线性求和更好的结果,因为它为位置分配不同的权重,因此在第2和第3字段产生相同散列的情况下,结果仍然是不同的。
10 + 2 + 18 = 18 + 10 + 2
BUT
10^3 + 2^2 + 18 != 18^3 + 10^2 + 2
哈希函数的正确设计实际上并不是一个简单的主题,而是涉及概率论。