java 中HashCode重复的可能性
作者:lqh 发布时间:2021-09-13 17:38:05
标签:java,HashCode
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重复
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持,如有疑问请留言或者到本站社区交流讨论,大家共同进步!
来源:http://www.cnblogs.com/steeven/archive/2005/03/24/124493.html


猜你喜欢
- 做项目时使用maven构建项目已经是现在的流行做法了。那么maven的作用是什么呢?maven中的几个常用的命令都有什么用?下面我们来看一下
- 注解@Validated和BindingResult对入参非空校验在项目当中少不了入参校验,服务器和浏览器互不信任,不能因为前端加入参判断了
- 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。#include <s
- 前言相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况,但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何
- 基本环境语言:Java 8 数据库:Oracle ORM 框架:MyBatis 3.4.5需求批量插入数据,数据需要有自增 id。每次插入有
- 无聊逛论坛,发现了这张图真是厉害啊,这排序, 既有多线程,又有排序,还有lambda表达式,但是这是C#版本,作为一个入坑的Java爱好者,
- 限流器算法目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法能够强行限制请求速率,平滑突发请求,而令牌桶算法在限定平均速
- 引语:工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource
- 工厂方法模式简述与简单工厂模式基本相同,只是工厂是一个抽象的,需要有具体的工厂去实现它,然后利用这个工厂生产产品,之所以出现这个模式是因为,
- java提供了Comparable接口与Compatator接口,它们为数组或集合中的元素提供了排序逻辑,实现此接口的对象数组或集合可以通过
- 安装完jdk环境后,编写第一个java程序hello.java:public class hello{
- 本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下:using System;using System.
- Kotlin中函数都是头等的,这意味着它可以存储在变量与数据结构中、作为参数传递给其他高阶函数以及从其他高阶函数返回。可以向操作任何其他非函
- 可以根据执行时间打印sql语句,打印的sql语句是带参数的,可以拷贝到查询分析器什么的直接运行package mybatis;import
- 一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的。尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,影响用户
- 1.代码调试的重要性代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。
- 本文实例为大家分享了C#用timer实现背单词小程序的具体代码,供大家参考,具体内容如下看到网上有类似的教程视频实现单词本,于是自己敲了一个
- 这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 一、概述在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInte
- 在springboot中,默认继承好了一套完好的redis包,可以直接使用,但是如果使用中出了错不容易找到错误的原因,因此这里使用自己配置的