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
相关文章:
linux top下的 minerd 木马清除方法
如何确保西部建站助手FTP传输的安全性?
建站与域名管理如何高效结合?
如何快速搭建支持数据库操作的智能建站平台?
如何用PHP快速搭建高效网站?分步指南
如何通过可视化优化提升建站效果?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
独立制作一个网站多少钱,建立网站需要花多少钱?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
阿里云网站制作公司,阿里云快速搭建网站好用吗?
兔展官网 在线制作,怎样制作微信请帖?
建站之星如何保障用户数据免受黑客入侵?
网站制作员失业,怎样查看自己网站的注册者?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
建站10G流量真的够用吗?如何应对访问高峰?
如何用搬瓦工VPS快速搭建个人网站?
如何通过虚拟主机快速完成网站搭建?
如何续费美橙建站之星域名及服务?
深圳网站制作的公司有哪些,dido官方网站?
网站制作免费,什么网站能看正片电影?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
如何快速搭建高效WAP手机网站吸引移动用户?
建站之星代理如何获取技术支持?
已有域名如何免费搭建网站?
如何通过主机屋免费建站教程十分钟搭建网站?
如何在西部数码注册域名并快速搭建网站?
如何构建满足综合性能需求的优质建站方案?
家庭服务器如何搭建个人网站?
如何用低价快速搭建高质量网站?
建站之星如何实现PC+手机+微信网站五合一建站?
制作网站的模板软件,网站怎么建设?
定制建站如何定义?其核心优势是什么?
网站企业制作流程,用什么语言做企业网站比较好?
盘锦网站制作公司,盘锦大洼有多少5G网站?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
免费ppt制作网站,有没有值得推荐的免费PPT网站?
建站主机CVM配置优化、SEO策略与性能提升指南
c# 在ASP.NET Core中管理和取消后台任务
javascript中的try catch异常捕获机制用法分析
香港服务器租用费用高吗?如何避免常见误区?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
如何通过FTP服务器快速搭建网站?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何在万网开始建站?分步指南解析
青浦网站制作公司有哪些,苹果官网发货地是哪里?
广州建站公司哪家好?十大优质服务商推荐
如何选择域名并搭建高效网站?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。