Java的8对字符串键,提供可选择散列遇到了大量关键哈希代码碰撞时的性能。 任何人都可以解释是什么,以及它是如何工作的?
Answer 1:
从这封电子邮件的core-lib-devs@openjkd
:
- 新接口Hashable32介绍。
- Hashable32提供了一种方法hash32()
- 串实现Hashable32和hash32()方法
- HashMap的等识别字符串并调用hash32()而不是hashCode()方法
代码的修改:
- Murmur3: https://code.google.com/p/smhasher/wiki/MurmurHash3
- althashing “7” webrev: http://cr.openjdk.java.net/~mduigou/althashing7/8/webrev/
- althashing “8” webrev: http://cr.openjdk.java.net/~mduigou/althashing8/8/webrev/
Answer 2:
带来更多的相关性这个问题,可选择散列已经从JDK 8退房删除:
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html
http://openjdk.java.net/jeps/180
这是有趣的是,曾经在散列桶的项目数量的增长超过一定的阈值,即斗将使用条目的链接列表,以平衡树切换。
HashMap中的散列(对象键)的功能进行了修订,没有特殊处理,String对象如下:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Answer 3:
应当指出的是,转向MurmurHash3不会阻止DoS攻击: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/
文章来源: What is alternative hashing for String keys in Java 8?