什么是Java 8中的字符串键的替代散列?
- 新接口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/
从我所知道的来看,旧的散列算法最大的缺陷是,它有时为长字符串返回零,并且指定特定的实现会阻止虚拟机实现“散列字符串”功能,该功能专为该特定机器上的最佳性能(例如,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);
}
+1这可以用来避免拒绝服务攻击。 – 2012-08-14 07:55:47
谢谢,我会牢记这一点 – 2012-08-14 08:00:40
@PeterLawrey当你提到DoS时,你是指[此错误报告](https://bugzilla.redhat.com/show_bug.cgi?id=750533)还是别的? – 2012-08-14 11:40:50