2012-08-14 52 views
10

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

回答

7

[email protected]this email

  • 新接口Hashable32介紹。
  • Hashable32提供了一種方法hash32()
  • 字符串實現Hashable32和hash32()方法
  • 的HashMap等識別字符串並調用hash32()而不是hashCode()方法

的修訂的代碼:

+0

從我所知道的來看,舊的散列算法最大的缺陷是,它有時爲長字符串返回零,並且指定特定的實現會阻止虛擬機實現「散列字符串」功能,該功能專爲該特定機器上的最佳性能(例如,64位機器可能使用以8字節爲一組操作的功能,然後將結果降至32位)。我想知道有多少代碼真的依賴於舊字符串散列的確切值,以及允許「兼容性解決方法」有多困難? – supercat 2013-01-26 21:14:21

6

帶來更多的相關性這個問題,替代哈希已從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); 
}