經過上一節的學習,咱們知道,散列表的查詢效率並不能籠統地說成是O(1)。它跟散列函數、裝載因子、散列衝突等都有關係。若是散列函數設計得很差,java
或者裝載因子過大,均可能致使散列衝突發生的機率升高,查詢效率降低。函數
在極端狀況下,有些惡意的攻擊者,還有可能經過精⼼構造的數據,使得全部的數據通過散列函數以後,都散列到同一個槽裏。若是咱們使用的是基於鏈表的衝突解決衝法,性能
那這個時候,散列表就會退化爲鏈表,查詢的時間複雜度就從O(1)急劇退化爲O(n)。
學習
若是散列表中有10萬個數據,退化後的散列表查詢的效率就降低了10萬倍。更直接點說,若是以前運⾏100次查詢只須要0.1秒,那如今就須要1萬秒。this
這樣就有可能由於查詢操做消耗耗量CPU或者線程資源,致使系統沒法響應其餘請求,從而達到拒絕服務攻擊(DoS)的⽬的。這也就是散列表碰撞攻擊的基本原理線程
今天,咱們就來學習一下,如何設計一個能夠應對各類異常狀況的⼯業級散列表,來避免在散列衝突的狀況下,散列表性能的急劇降低,而且能抵抗散列碰撞攻擊?設計
一、會有什麼後果3d
二、數據集合code
三、動態散列表對象
四、動態擴容
一、方法
二、存在的問題
三、支持動態擴容散列表插入操做的時間複雜度
四、實際狀況
一、優勢
二、缺點
三、總結
一、優勢
二、缺點
三、實際應用
其中,hashCode()返回的是Java對象的hash code。好比String類型的對象的hashCode()就是下面這樣:
public int hashCode() { int var1 = this.hash; if(var1 == 0 && this.value.length > 0) { char[] var2 = this.value; for(int var3 = 0; var3 < this.value.length; ++var3) { var1 = 31 * var1 + var2[var3]; } this.hash = var1; } return var1; }