Java hashcode()字符串冲突

ckd*_*ckd 3 java hashcode collision

我对哈希码知之甚少.我发现这个代码可以打印出碰撞.

你能告诉我什么是碰撞以及如何减少它?我们为什么要使用哈希码?

public static int getHash(String str, int limit)
{
    int hashCode = Math.abs(str.hashCode()%(limit));
    return hashCode;
}

/**
 * @param args
 */
public static void main(String[] args)
{
    int hashLimit = 10000;
    int stringsLimit = 10000;
    String[] arr = new String[hashLimit];
    List<String> test = new ArrayList<String>();
    Random r = new Random(2);
    for ( int i = 0 ; i < stringsLimit ; i++ )
    {
        StringBuffer buf = new StringBuffer("");
        for ( int j = 0 ; j < 10 ; j++ )
        {
            char c = (char)(35+60*r.nextDouble());
            buf.append(c);
        }
        test.add(buf.toString());
        //System.out.println(buf.toString());
    }
    int collisions = 0;
    for ( String curStr : test )
    {
        int hashCode = getHash(curStr,hashLimit);
        if ( arr[hashCode] != null && !arr[hashCode].equals(curStr) )
        {
            System.out.println("collision of ["+arr[hashCode]+"] ("+arr[hashCode].hashCode()+" = "+hashCode+") with ["+curStr+"] ("+curStr.hashCode()+" = "+hashCode+")");
            collisions++;
        }
        else
        {
            arr[hashCode] = curStr;
        }
    }
    System.out.println("Collisions: "+collisions);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 18

你能告诉我什么是碰撞以及如何减少它?

冲突是两个不相等的对象具有相同的哈希码.他们是生活中的事实 - 你需要处理它.

我们为什么要使用哈希码?

因为他们基本上可以快速按键查找值.哈希表可以使用哈希代码非常快速地将可能的密钥匹配集合下载到非常小的集合(通常只有一个),此时您需要检查实际的密钥相等性.

永远不应该假设两个哈希码相等意味着它们派生的对象是相等的.只有相反的情况:假设一个正确的实现,如果两个对象给出不同的哈希码,那么它们就不相等.

  • @HelloWorld:你明确地将哈希码限制为*最多*10,000个不同的值.这是一个相当糟糕的起点.目前还不清楚你要做什么,但如果你要编写自己的哈希表,我会先做一些研究.你*必须*能够应对碰撞,并且有各种不同的方法. (4认同)