哈希函数和组合多个键

标签 hash

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

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

或者

 a^3 + b^2 + c ^1

指数部分产生比线性求和更好的结果,因为它为位置分配不同的权重,因此如果第二个和第三个字段产生相同的散列,结果仍然会不同。

10 + 2 + 18 = 18 + 10 + 2

但是

10^3 + 2^2 + 18 != 18^3 + 10^2 + 2   

哈希函数的正确设计确实不是一个简单的话题,涉及到概率论。

关于哈希函数和组合多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087272/

相关文章:

java - 基于Hash Code实现Equals

python - 顺序 SHA 256 哈希为相同的输入提供不同的输出

arrays - 反转数组中键、值的顺序转换为哈希

php - 登录授权,如何检查密码是否匹配SALT + HASH - PHP + MySQL

ruby-on-rails - Ruby 哈希组合

algorithm - 除了替代哈希码字符串生成之外,Google 的 CityHash 有什么用?

arrays - Perl循环遍历单个元素的数组哈希

c# - JavaScript 中的 SHA256 哈希密码验证

python - 为什么 Python 的 hash() 值的长度不同?

php - 如何获取另一个页面上的 vbulletin 注销哈希值? (PHP)