今天有同事提议用String的hashcode得到int类型作为主键。其实hashcode重复的可能性超大,下面是java的缺省算法:
{
HashCode有多大可能重复?    int h = hash;
{
HashCode有多大可能重复?        
int off = offset;
HashCode有多大可能重复?        
char val[] = value;
HashCode有多大可能重复?        
int len = count;
HashCode有多大可能重复?
{
HashCode有多大可能重复?                h 
= 31*+ val[off++];
HashCode有多大可能重复?            }

HashCode有多大可能重复?            hash 
= h;
HashCode有多大可能重复?        }

HashCode有多大可能重复?        
return h;
HashCode有多大可能重复?    }
但是什么情况下会重复?下面是测试代码




HashCode有多大可能重复?import java.util.HashMap;
HashCode有多大可能重复?
{
HashCode有多大可能重复?
HashCode有多大可能重复?    
static HashMap map = new HashMap();
HashCode有多大可能重复?
HashCode有多大可能重复?    
private static char startChar = 'A';
HashCode有多大可能重复?
HashCode有多大可能重复?    
private static char endChar = 'z';
HashCode有多大可能重复?
HashCode有多大可能重复?    
private static int offset = endChar - startChar + 1;
HashCode有多大可能重复?
HashCode有多大可能重复?    
private static int dup = 0;
HashCode有多大可能重复?
{
HashCode有多大可能重复?        
int len = 3;
HashCode有多大可能重复?        
char[] chars = new char[len];
HashCode有多大可能重复?        tryBit(chars, len);
HashCode有多大可能重复?        System.
out.println((int)Math.pow(offset, len) + ":" + dup);
HashCode有多大可能重复?    }

HashCode有多大可能重复?
{
{
HashCode有多大可能重复?            chars[i 
- 1= j;
HashCode有多大可能重复?            
if (i > 1)
HashCode有多大可能重复?                tryBit(chars, i 
- 1);
HashCode有多大可能重复?            
else
HashCode有多大可能重复?                test(chars);
HashCode有多大可能重复?        }

HashCode有多大可能重复?    }

HashCode有多大可能重复?
{
HashCode有多大可能重复?
HashCode有多大可能重复?        String str 
= new String(chars).replaceAll("[^a-zA-Z_]""").toUpperCase();// 195112:0
HashCode有多大可能重复?        
//String str = new String(chars).toLowerCase();//195112:6612
HashCode有多大可能重复?        
//String str = new String(chars).replaceAll("[^a-zA-Z_]","");//195112:122500
HashCode有多大可能重复?        
//String str = new String(chars);//195112:138510
HashCode有多大可能重复?
        int hash = str.hashCode();
{
HashCode有多大可能重复?            String s 
= (String) map.get(hash);
{
HashCode有多大可能重复?                dup
++;
HashCode有多大可能重复?                System.
out.println(s + ":" + str);
HashCode有多大可能重复?            }

{
HashCode有多大可能重复?            map.put(hash, str);
HashCode有多大可能重复?            
// System.out.println(str);
HashCode有多大可能重复?
        }
HashCode有多大可能重复?    }

HashCode有多大可能重复?}

HashCode有多大可能重复?

在A-z范围内有特殊字符,从结果看,仅仅3位长度的字符串:
不处理: 138510次重复
去掉字母意外字符: 122500次重复
所有字符转小写:6612次重复(少了很多)
去掉字母意外字符,并且转小写:没有重复!4位字符串也没见重复

不难看出:
1. 缺省实现为英文字母优化
2. 字母大小写可能导致重复

可能:
长字符串可能hashcode重复
中文字符串和特殊字符可能hashcode重复

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-25
  • 2022-12-23
  • 2021-06-04
  • 2021-04-26
猜你喜欢
  • 2022-12-23
  • 2021-08-23
  • 2021-06-09
  • 2022-12-23
  • 2021-07-26
  • 2021-07-20
  • 2021-11-16
相关资源
相似解决方案