哈希函数和组合多个键
Posted
技术标签:
【中文标题】哈希函数和组合多个键【英文标题】:Hash function and combining multiple keys 【发布时间】:2012-12-14 18:24:55 【问题描述】:我在每个元素中有三个键(两个字符串和一个整数),我想设计一个哈希函数。为了使哈希表统一,我想使用所有三个键。我应该走什么路?
private:
string name;
int age;
string homeTown;
【问题讨论】:
这缺少很多上下文:语言、字符串的大小、字符串/整数的分布? 【参考方案1】:最简单的实现会像这样使用每个字段的键总和:
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
哈希函数的正确设计确实不是一个简单的话题,涉及到概率论。
【讨论】:
那么我在哪里可以找到关于这个的算法?所有算法都是一键设计的。 如果速度没有问题,那么使用:a^3 + b^2 + c 您打算拥有多少条记录/实体?您打算多久将它们放入/取出哈希表?如果您有人员列表,则只需使用他们的 SSN。如果我看到您的类声明代码(用于推断其含义/可能分布的字段名),我会给您更好的建议 其实速度很重要。大约2000个条目。实际上这是一个作业,他们将根据作业的速度和均匀性来给作业评分。我编辑了问题。 然后使用这个:name.getHash()*1000 + homeTown.getHash()*10 + age.getHash()。并确保未检查此操作是否溢出以上是关于哈希函数和组合多个键的主要内容,如果未能解决你的问题,请参考以下文章
算法初级面试题05——哈希函数/表生成多个哈希函数哈希扩容利用哈希分流找出大文件的重复内容设计RandomPool结构布隆过滤器一致性哈希并查集岛问题