关于地图中的碰撞

时间:2012-08-05 05:27:23

标签: java collections hashmap

我正在浏览HashMap并阅读以下分析..

  
      
  1. HashMap的一个实例有两个影响其性能的参数:初始容量和负载因子。

  2.   
  3. 容量是哈希表中的桶数,初始容量就是创建哈希表时的容量。

  4.   
  5. 负载系数衡量哈希表在其容量自动增加之前可以获得多长时间。

  6.   
  7. 当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即重建内部数据结构),以便哈希表大约有两次水桶的数量。

  8.   
  9. 默认初始容量为16,默认加载因子为0.75。您可以在地图的构造函数中提供其他值。

  10.   

现在假设我有一张地图..

HashMap map=new HashMap();//HashMap key random order.
         System.out.println("Amit".hashCode());
         map.put("Amit","Java");
         map.put("mAit","J2EE");
         map.put("Saral","J2rrrEE");

我想发生碰撞,请告知碰撞是怎么发生的。!!

4 个答案:

答案 0 :(得分:2)

我相信确切的hashmap行为是依赖于实现的。然而,只要看看你的类库正在进行散列并构造一个碰撞。这很简单。

如果你想要在任意对象而不是字符串上进行碰撞,那就容易多了。只需使用始终为hashCode()的自定义returns 0创建一个类。

答案 1 :(得分:1)

如果您想要发生真正的碰撞,那么最好编写自己的自定义哈希码。比如说,如果你想要AmitmAit的冲突,你可以做一件事,只需使用字符的ascii值作为哈希码。你会得到不同键的碰撞。

答案 2 :(得分:0)

当2个键具有相同的哈希键时,将发生冲突。 我没有计算你的密钥哈希密钥,但我不认为它们具有相同的哈希密钥,因此如果它们没有相同的哈希密钥,则不会发生冲突。 如果你将相同的字符串作为键而不是碰撞

答案 3 :(得分:0)

这里的碰撞肯定是可能的,并不依赖于哈希表的实现。 HashMap通过使用Object.hashCode将对象映射到存储桶,然后使用碰撞解决机制(OpenJDK实现使用单独链接)与Object.equals进行内部工作。

要回答您的问题,String.hashCode已经明确了兼容性......

  

返回此字符串的哈希码。 String对象的哈希码计算为    s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

     

使用int算术,其中s[i]是字符串的 i - 字符,n是字符串的长度,{{1指示取幂。 (空字符串的哈希值为零。)

或者,代码(来自OpenJDK

^

与任何哈希函数一样,冲突也是可能的。根据{{​​3}},它指出,例如,public int hashCode() { int h = hash; if (h == 0 && count > 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; } "FB"会产生相同的值。

如果你想要更多,那么找到具有相同散列值的冲突应该是一个微不足道的暴力问题。


作为旁注,我想我会指出这与 The C Programming Language 的第二版中的功能非常相似:

"Ea"