经过上一节的学习,咱们知道,散列表的查询效率并不能笼统地说成是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; }