首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减少哈希冲突?

如何减少哈希冲突?
EN

Stack Overflow用户
提问于 2013-01-26 14:16:17
回答 1查看 3.9K关注 0票数 2

我写了一些代码,从文件中读取一些单词及其含义,并将它们映射到一个数组(生成哈希表)。它使用多项式哈希码和压缩方法。

我的目标是尽可能减少碰撞,但我不知道如何减少。

代码语言:javascript
复制
public int hashcode(Entry my){ 
    Object key=my.getKey(); 
    int sum=0 ,z=33; 
    char[] chars = new char[key.toString().length()]; 
    chars=key.toString().toCharArray(); 
    for(int i=0; i < chars.length; i++){ 
         sum += (chars[i])*Math.pow(z,i);
    } 
    return sum;
}  

这是我的compress方法(对于大小为100的数组):

代码语言:javascript
复制
public int compress(int hashcode){ 
    return hashcode%100; 
}

我是否应该改变我的压缩方法,或者有一些方法可以帮助我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-26 21:13:44

您似乎正在寻找的是一个完美的散列函数,不幸的是,据我所知,这样的散列并不存在:)

要指出的另一件事是,哈希函数的性能也因您想要实现的结果类型而有所不同;我的意思是,哈希函数在“存储”电话号码方面可能表现出色,但在存储联系人姓名方面却表现不佳。

快速浏览一下你的代码,我会说你的散列函数太复杂了。

首先,我想指出您当前算法的一个问题:'sum+=(charsi)*Math.pow(z,i);‘这一行将返回的值远远超出了长度超过4-5个字符的单词的整数范围(只是猜测)。您可能会说这没问题,因为它会溢出等等,但事实并非如此,因为sum+=语法实际上隐藏了一个类型转换(试着把它写成sum=sum+),在这种情况下,sum的值将是Integer.MAX_VALUE。这可能就是你的算法现在很慢的原因。

如果我是您,出于字典的目的(这似乎就是您正在尝试做的事情),并假设Entry#getKey()是String类型,我可能只会使用:

代码语言:javascript
复制
public int hashcode(Entry my) {
    return my.getKey().hashCode();
}

如果你仍然想要想出你自己的散列函数,为什么不用一些更简单的东西,比如:单词长度+前X个字母的字符代码+最后一个字母的字符代码,这样结果就可以放入一个int中。这只是一个想法:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14534431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档