13

Java 8 正在为字符串键提供替代散列,以在遇到大量键散列码冲突时提高性能。谁能解释那是什么以及它将如何工作?

4

3 回答 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()

代码的修订:

于 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 回答