什么是Java 8中String键的替代散列?
Java 8为String键提供了替代散列,以在遇到大量密钥哈希码冲突时提高性能。 任何人都可以解释它是什么以及它将如何工作?
来自core-lib-devs@openjkd
这封电子邮件 :
- 引入了新的接口Hashable32。
- Hashable32提供方法hash32()
- String实现Hashable32和hash32()方法
- HashMap等识别String并调用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/
为了更好地解决这个问题,已从JDK 8中删除了替代哈希。检查:
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html
http://openjdk.java.net/jeps/180
有趣的是,一旦哈希桶中的项目数量增长超过某个阈值,该桶就会从使用链接的条目列表切换到平衡树。
HashMap中的哈希(Object key)函数已修改为以下内容,对String对象没有特殊处理:
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
应该注意的是,向MurmurHash3的转变不会阻止DoS攻击: http : //emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/