java 中HashCode重復(fù)的可能性
java 中HashCode重復(fù)的可能性
今天有同事提議用String的hashcode得到int類型作為主鍵。其實(shí)hashcode重復(fù)的可能性超大,下面是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;
}
但是什么情況下會(huì)重復(fù)?下面是測(cè)試代碼
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范圍內(nèi)有特殊字符,從結(jié)果看,僅僅3位長(zhǎng)度的字符串:
不處理: 138510次重復(fù)
去掉字母意外字符: 122500次重復(fù)
所有字符轉(zhuǎn)小寫:6612次重復(fù)(少了很多)
去掉字母意外字符,并且轉(zhuǎn)小寫:沒(méi)有重復(fù)!4位字符串也沒(méi)見重復(fù)
不難看出:
1. 缺省實(shí)現(xiàn)為英文字母優(yōu)化
2. 字母大小寫可能導(dǎo)致重復(fù)
可能:
長(zhǎng)字符串可能hashcode重復(fù)
中文字符串和特殊字符可能hashcode重復(fù)
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,大家共同進(jìn)步!
- java中hashCode方法與equals方法的用法總結(jié)
- 詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系
- 重寫hashCode()和equals()方法詳細(xì)介紹
- JAVA hashCode使用方法詳解
- 詳解Java中用于查找對(duì)象哈希碼值的hashCode()函數(shù)
- 為什么在重寫 equals方法的同時(shí)必須重寫 hashcode方法
- why在重寫equals時(shí)還必須重寫hashcode方法分享
- javascript中實(shí)現(xiàn)兼容JAVA的hashCode算法代碼分享
- 重新實(shí)現(xiàn)hashCode()方法
相關(guān)文章
利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作
這篇文章主要介紹了利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
springboot封裝JsonUtil,CookieUtil工具類代碼實(shí)例
這篇文章主要介紹了springboot封裝JsonUtil,CookieUtil工具類過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java用BigDecimal解決double類型相減時(shí)可能存在的誤差
這篇文章主要介紹了Java用BigDecimal解決double類型相減時(shí)可能存在的誤差,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
使用遞歸算法結(jié)合數(shù)據(jù)庫(kù)解析成Java樹形結(jié)構(gòu)的代碼解析
這篇文章主要介紹了使用遞歸算法結(jié)合數(shù)據(jù)庫(kù)解析成Java樹形結(jié)構(gòu)的代碼解析的相關(guān)資料,需要的朋友可以參考下2017-09-09
java中@Configuration使用場(chǎng)景
本文主要介紹了java中@Configuration使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

