java 中HashCode重复的可能性

今天有同事提议用String的hashcode得到int类型作为主键。其实hashcode重复的可能性超大,下面是java的缺省算法:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
但是什么情况下会重复?下面是测试代码
import java.util.HashMap;
public class Test {
static HashMap map = new HashMap();
private static char startChar = 'A';
private static char endChar = 'z';
private static int offset = endChar - startChar + 1;
private static int dup = 0;
public static void main(String[] args) {
int len = 3;
char[] chars = new char[len];
tryBit(chars, len);
System.out.println((int)Math.pow(offset, len) + ":" + dup);
}
private static void tryBit(char[] chars, int i) {
for (char j = startChar; j <= endChar; j++) {
chars[i - 1] = j;
if (i > 1)
tryBit(chars, i - 1);
else
test(chars);
}
}
private static void test(char[] chars) {
String str = new String(chars).replaceAll("[^a-zA-Z_]", "").toUpperCase();// 195112:0
//String str = new String(chars).toLowerCase();//195112:6612
//String str = new String(chars).replaceAll("[^a-zA-Z_]","");//195112:122500
//String str = new String(chars);//195112:138510
int hash = str.hashCode();
if (map.containsKey(hash)) {
String s = (String) map.get(hash);
if (!s.equals(str)) {
dup++;
System.out.println(s + ":" + str);
}
} else {
map.put(hash, str);
// System.out.println(str);
}
}
}
在A-z范围内有特殊字符,从结果看,仅仅3位长度的字符串:
不处理: 138510次重复
去掉字母意外字符: 122500次重复
所有字符转小写:6612次重复(少了很多)
去掉字母意外字符,并且转小写:没有重复!4位字符串也没见重复
不难看出:
1. 缺省实现为英文字母优化
2. 字母大小写可能导致重复
可能:
长字符串可能hashcode重复
中文字符串和特殊字符可能hashcode重复
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持,如有疑问请留言或者到本站社区交流讨论,大家共同进步!
# java
# HashCode
# HashCode的重复测试
# java中hashCode方法与equals方法的用法总结
# 详解hashCode()和equals()的本质区别和联系
# 重写hashCode()和equals()方法详细介绍
# JAVA hashCode使用方法详解
# 详解Java中用于查找对象哈希码值的hashCode()函数
# 为什么在重写 equals方法的同时必须重写 hashcode方法
# why在重写equals时还必须重写hashcode方法分享
# javascript中实现兼容JAVA的hashCode算法代码分享
# 重新实现hashCode()方法
# 特殊字符
# 也没
# 如有
# 希望能
# 少了
# 内有
# 谢谢大家
# 英文字母
# 共同进步
# 主键
# 疑问请
# 情况下
# return
# import
# count
# len
# lt
# startChar
# map
# private
相关文章:
如何快速上传建站程序避免常见错误?
如何选择服务器才能高效搭建专属网站?
如何快速搭建高效服务器建站系统?
如何选择适配移动端的WAP自助建站平台?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
网站制作公司,橙子建站是合法的吗?
如何实现建站之星域名转发设置?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
深圳网站制作案例,网页的相关名词有哪些?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
动图在线制作网站有哪些,滑动动图图集怎么做?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
seo网站制作优化,网站SEO优化步骤有哪些?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
网站专业制作公司有哪些,做一个公司网站要多少钱?
如何快速搭建自助建站会员专属系统?
建站之星官网登录失败?如何快速解决?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何快速查询网站的真实建站时间?
建站之星安装提示数据库无法连接如何解决?
建站DNS解析失败?如何正确配置域名服务器?
智能起名网站制作软件有哪些,制作logo的软件?
如何在腾讯云服务器快速搭建个人网站?
,制作一个手机app网站要多少钱?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
网站企业制作流程,用什么语言做企业网站比较好?
建站与域名管理如何高效结合?
建站主机选哪种环境更利于SEO优化?
如何挑选优质建站一级代理提升网站排名?
如何选购建站域名与空间?自助平台全解析
如何通过wdcp面板快速创建网站?
javascript中的try catch异常捕获机制用法分析
建站主机空间推荐 高性价比配置与快速部署方案解析
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
网站网页制作专业公司,怎样制作自己的网页?
官网网站制作腾讯审核要多久,联想路由器newifi官网
重庆网站制作公司哪家好,重庆中考招生办官方网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
建站之星如何防范黑客攻击与数据泄露?
c# 在ASP.NET Core中管理和取消后台任务
*请认真填写需求信息,我们会在24小时内与您取得联系。