我正在浏览HashMap并阅读以下分析..
HashMap的一个实例有两个影响其性能的参数:初始容量和负载因子。
容量是哈希表中的桶数,初始容量就是创建哈希表时的容量。
负载系数衡量哈希表在其容量自动增加之前可以获得多长时间。
当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即重建内部数据结构),以便哈希表大约有两次水桶的数量。
- 醇>
默认初始容量为16,默认加载因子为0.75。您可以在地图的构造函数中提供其他值。
现在假设我有一张地图..
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");
我想发生碰撞,请告知碰撞是怎么发生的。!!
答案 0 :(得分:2)
我相信确切的hashmap行为是依赖于实现的。然而,只要看看你的类库正在进行散列并构造一个碰撞。这很简单。
如果你想要在任意对象而不是字符串上进行碰撞,那就容易多了。只需使用始终为hashCode()
的自定义returns 0
创建一个类。
答案 1 :(得分:1)
如果您想要发生真正的碰撞,那么最好编写自己的自定义哈希码。比如说,如果你想要Amit
和mAit
的冲突,你可以做一件事,只需使用字符的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"