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
相关文章:
c# await 一个已经完成的Task会发生什么
如何在云虚拟主机上快速搭建个人网站?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何用狗爹虚拟主机快速搭建网站?
建站主机默认首页配置指南:核心功能与访问路径优化
公众号网站制作网页,微信公众号怎么制作?
油猴 教程,油猴搜脚本为什么会网页无法显示?
广州营销型建站服务商推荐:技术优势与SEO优化解析
Android使用GridView实现日历的简单功能
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
网站好制作吗知乎,网站开发好学吗?有什么技巧?
c# 服务器GC和工作站GC的区别和设置
网页设计网站制作软件,microsoft office哪个可以创建网页?
为什么Go需要go mod文件_Go go mod文件作用说明
seo网站制作优化,网站SEO优化步骤有哪些?
网站制作网站,深圳做网站哪家比较好?
建站之星安装提示数据库无法连接如何解决?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何快速搭建自助建站会员专属系统?
建站之星客服服务时间及联系方式如何?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
,在苏州找工作,上哪个网站比较好?
网站制作价目表怎么做,珍爱网婚介费用多少?
广东企业建站网站优化与SEO营销核心策略指南
c++怎么用jemalloc c++替换默认内存分配器【性能】
小建面朝正北,A点实际方位是否存在偏差?
外贸公司网站制作哪家好,maersk船公司官网?
建站之星如何防范黑客攻击与数据泄露?
如何在万网自助建站平台快速创建网站?
建站上传速度慢?如何优化加速网站加载效率?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
建站之星代理平台如何选择最佳方案?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
免费视频制作网站,更新又快又好的免费电影网站?
建站之星导航配置指南:自助建站与SEO优化全解析
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何通过可视化优化提升建站效果?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何在云主机上快速搭建多站点网站?
建站上市公司网站建设方案与SEO优化服务定制指南
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何在景安云服务器上绑定域名并配置虚拟主机?
电商网站制作价格怎么算,网上拍卖流程以及规则?
TestNG的testng.xml配置文件怎么写
如何快速生成ASP一键建站模板并优化安全性?
如何选择香港主机高效搭建外贸独立站?
*请认真填写需求信息,我们会在24小时内与您取得联系。