【HashCode】字符串哈希码巧合验证

已知哈希码是根据对象特性生成,但是还是会存在不同对象计算出相同哈希码的巧合。今天以String为例进行了验证。

代码如下:

import java.util.HashSet;
import java.util.Random;

/**
 * Test Clazz
 * @author Lix
 */

public class Test{
	public static final int SIZE = 7;
	public static final int TIME = 100000;
    public static void main(String argv[]){
    	
    	HashSet
   
   
    
     hsi = new HashSet
    
    
     
     (); 
    	HashSet
     
     
      
       hss = new HashSet
      
      
       
       (); 
    	Random ra = new Random();
    	StringBuffer sb;
    	String tempString = "";

    	for (int i = 0; i < TIME; i++) {
    		sb = new StringBuffer();
			for (int j = 0; j < SIZE; j++) {
				sb.append((char)(ra.nextInt(26)+97));
			}
			tempString = sb.toString();
			//System.out.println(tempString);
			
			if(!hsi.add(tempString.hashCode())){
				System.out.println("HashCode:"+tempString.hashCode());
				System.out.println("String A:"+tempString);
				
				for(Object obj:hss){
					if(obj.hashCode() == tempString.hashCode() && !obj.equals(tempString)){
						System.out.println("String B:"+obj);
					}
				}
				
			}
			
			hss.add(tempString);

		}
    	
    	System.out.println(hss.size()+":"+hsi.size()+"\n");
    	
    	System.out.println("\nExample:");
    	String a = "mvnjdam";
    	String b = "wlosaru";
    	String c = "ypxludk";
    	String d = "tuwwvkg";
    	String e = "wmriczg";
    	String f = "rrqtebc";
    	
    	System.out.println("a.hash:"+a.hashCode()+"\nb.hash:"+b.hashCode());
    	System.out.println("c.hash:"+c.hashCode()+"\nd.hash:"+d.hashCode());
    	System.out.println("e.hash:"+e.hashCode()+"\nf.hash:"+f.hashCode());
    }
}
      
      
     
     
    
    
   
   
例如在随机字符串长度为7(全部为小写字母)时,生成的十万个字符串有一定几率出现多个字符串不同而Hash码相同的情况。

因此,在某些需要进行String严格比较的场合,需要在哈希码比较验证之后追加equals比较验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值