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
相关文章:
建站之星微信建站一键生成小程序+多端营销系统
如何通过wdcp面板快速创建网站?
建站之星与建站宝盒如何选择最佳方案?
定制建站流程步骤详解:一站式方案设计与开发指南
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何在阿里云完成域名注册与建站?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
文字头像制作网站推荐软件,醒图能自动配文字吗?
设计网站制作公司有哪些,制作网页教程?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
建站三合一如何选?哪家性价比更高?
如何在企业微信快速生成手机电脑官网?
详解jQuery中基本的动画方法
魔毅自助建站系统:模板定制与SEO优化一键生成指南
建站之星代理如何获取技术支持?
建站之星如何实现五合一智能建站与营销推广?
如何彻底卸载建站之星软件?
盐城做公司网站,江苏电子版退休证办理流程?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
外贸公司网站制作哪家好,maersk船公司官网?
建站之星后台密码遗忘?如何快速找回?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
建站主机选择指南:服务器配置与SEO优化实战技巧
如何通过可视化优化提升建站效果?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
Android滚轮选择时间控件使用详解
如何将凡科建站内容保存为本地文件?
如何选择高性价比服务器搭建个人网站?
个人网站制作流程图片大全,个人网站如何注销?
盘锦网站制作公司,盘锦大洼有多少5G网站?
如何用狗爹虚拟主机快速搭建网站?
如何选择PHP开源工具快速搭建网站?
如何有效防御Web建站篡改攻击?
宝塔Windows建站如何避免显示默认IIS页面?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何通过WDCP绑定主域名及创建子域名站点?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何在万网开始建站?分步指南解析
,sp开头的版面叫什么?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
ui设计制作网站有哪些,手机UI设计网址吗?
如何高效完成自助建站业务培训?
如何获取开源自助建站系统免费下载链接?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何快速完成中国万网建站详细流程?
*请认真填写需求信息,我们会在24小时内与您取得联系。