Java 8 正在为字符串键提供替代散列,以在遇到大量键散列码冲突时提高性能。谁能解释那是什么以及它将如何工作?
问问题
4218 次
3 回答
10
为了使这个问题更加相关,替代散列已从 JDK 8 中删除。查看:
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/changes8.html
http://openjdk.java.net/jeps/180
有趣的是,一旦哈希桶中的项目数增长超过某个阈值,该桶将从使用条目的链接列表切换到平衡树。
HashMap 中的 hash(Object key) 函数已修改为如下,对 String 对象没有特殊处理:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
于 2014-08-08T06:34:58.040 回答
8
从这封电子邮件:core-lib-devs@openjkd
- 引入了一个新的接口 Hashable32。
- Hashable32 提供了一个方法 hash32()
- String 实现 Hashable32 和 hash32() 方法
- HashMap 等人识别 String 并调用 hash32() 而不是 hashCode()
代码的修订:
- 杂音3: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/
于 2012-08-14T11:36:31.350 回答
3
需要注意的是,转向 MurmurHash3 并不能防止 DoS 攻击: http ://emboss.github.com/blog/2012/12/14/break-murmur-hash-flooding-dos-reloaded/
于 2013-08-09T13:40:13.280 回答