什么是Java 8中的字符串键的替代散列?

问题描述:

Java 8为String键提供了备选散列,以在遇到大量关键散列码冲突时提高性能。任何人都可以解释它是什么以及它的工作原理吗?什么是Java 8中的字符串键的替代散列?

+1

+1这可以用来避免拒绝服务攻击。 – 2012-08-14 07:55:47

+0

谢谢,我会牢记这一点 – 2012-08-14 08:00:40

+0

@PeterLawrey当你提到DoS时,你是指[此错误报告](https://bugzilla.redhat.com/show_bug.cgi?id=750533)还是别的? – 2012-08-14 11:40:50

[email protected]this email

  • 新接口Hashable32介绍。
  • Hashable32提供了一种方法hash32()
  • 字符串实现Hashable32和hash32()方法
  • 的HashMap等识别字符串并调用hash32()而不是hashCode()方法

的修订的代码:

+0

从我所知道的来看,旧的散列算法最大的缺陷是,它有时为长字符串返回零,并且指定特定的实现会阻止虚拟机实现“散列字符串”功能,该功能专为该特定机器上的最佳性能(例如,64位机器可能使用以8字节为一组操作的功能,然后将结果降至32位)。我想知道有多少代码真的依赖于旧字符串散列的确切值,以及允许“兼容性解决方法”有多困难? – supercat 2013-01-26 21:14:21

应该指出的是,转向MurmurHash3不会阻止DoS攻击: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/

带来更多的相关性这个问题,替代哈希已从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); 
}