Java 8爲String鍵提供了備選散列,以在遇到大量關鍵散列碼衝突時提高性能。任何人都可以解釋它是什麼以及它的工作原理嗎?什麼是Java 8中的字符串鍵的替代散列?
10
A
回答
7
- 新接口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/
+0
從我所知道的來看,舊的散列算法最大的缺陷是,它有時爲長字符串返回零,並且指定特定的實現會阻止虛擬機實現「散列字符串」功能,該功能專爲該特定機器上的最佳性能(例如,64位機器可能使用以8字節爲一組操作的功能,然後將結果降至32位)。我想知道有多少代碼真的依賴於舊字符串散列的確切值,以及允許「兼容性解決方法」有多困難? – supercat 2013-01-26 21:14:21
2
應該指出的是,轉向MurmurHash3不會阻止DoS攻擊: http://emboss.github.com/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/
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);
}
相關問題
- 1. 用Java中的散列表替換字符串中的值
- 2. 用紅寶石中的新字符串替換散列鍵
- 3. 爲什麼散列的字符串鍵被凍結?
- 4. 什麼是將被散列的字符串的最大長度?
- 5. 什麼是Java中的字符串池?
- 6. CSS中的`〜`代字符串是什麼?
- 7. Java中'\ f'字符的替代方法是什麼?
- 8. 字符串的散列碼
- 9. 什麼時候需要字符串作爲散列鍵
- 10. JAVA中的逐字符串替代品
- 11. Php找出什麼類型的散列是一個字符串
- 12. Python:Blake2b的散列鍵中字母'b'的用法是什麼
- 13. mod_rewrite的替代查詢字符串鍵
- 14. 什麼是iPhone 8,iPhone 8 Plus和iPhone X的用戶代理字符串?
- 15. 什麼是iPhone的鍵盤替代品?
- 16. 替代Java 8中的Thread.stop()?
- 17. 替換字符串中的字符Java
- 18. Java - 替換字符串中的字符
- 19. Java - 替換字符串中的字符
- 20. 替換Java字符串中的'\'字符
- 21. Java - 字符串中的字符替換
- 22. 替換字符串中的字符,Java
- 23. 我怎麼能代替{內部字符串中的Java
- 24. Java中的散列鍵
- 25. 什麼是iOS8中的NSObject中的散列替換
- 26. 什麼字符在散列鍵中有效?
- 27. 用str_ireplace代替文件中的字符串替換字符串
- 28. 爲什麼字符串與它的散列哈希,因爲鹽返回散列?
- 29. 用UTF-8編碼字符java替換字符串中的特殊字符?
- 30. 迭代Java中的字符串列表?
+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