zoukankan      html  css  js  c++  java
  • [Java复习]Hashcode

    昨天面试被问到Object中的hashcode的作用,之前并没有注意到。今天做一个总结

    hashcode():返回对象的hash码值。从object中继承过来,默认使用对象的地址计算散列码及hash地址。

    在java的Collection中大体分为:Set、List、Map三种体系,其中Set是无序不可重复集合,List为有序重复集合,Map代表键值对。

    对于不可重复的集合,是如何实现元素不重复的呢?JVM通过hash的方式,查看hash地址上是否有内容,如果没有的话就认为不存在相同的内容。

    在object类中定义为:public native int hashCode();可见是native方法,实现是根据本地机器相关的。

    注意,hash后的地址不一定是实际的内存地址

    equals():谈到hashcode就不能不关注equals,equals方法对两个对象的地址进行比较,判断是否相同。(注意对于String,Math,Integer,Double这些封装类在使用equals时已经覆盖了object的equals方法)

    在object中定义为:

    public boolean equals(Object obj) { 
        return (this == obj); 
    }

    对于hashcode和equals我理解一个是逻辑地址,一个是实际地址。equlas相等必须是对象值相同,且地址也是相同的。如果两个对象equals,java环境会认为他们的hashcode一定相等,所以如果重写equals方法那么一定要重写hashcode方法。但是两个对象不equals,但是hashcode有可能相等。hashcode是否相等,跟equals是否相等无关。

    从hashcode有引申到最近的hashdos攻击:在多数web容器的设计中,request是依靠相应语言的hashtable/hashmap实现的,当不同的key存入是如果hash值相同则每次都要解决冲突hash表被变为一个普通链表,原来的O(1)读取会变成O(n)的读取。
    官方解决办法:限制最大请求body大小,限制请求的参数个数 
    我给出的解决方法:把大hash表变成n个小hash表,一个key值先做一次hash计算要放到哪个小hash表中,然后再做一次hash得到真实的hash地址。这样做的好处是,增加攻击难度即使有攻击影响的范围也不大。但是有一个问题是hash地址将由两部分组成,存储和计算都要重新设计。
  • 相关阅读:
    构造函数的特点
    HashMap源码分析
    DVWA-7.1 SQL Injection(SQL注入)-Low
    DVWA-6.4 Insecure CAPTCHA(不安全的验证码)-Impossible
    DVWA-6.3 Insecure CAPTCHA(不安全的验证码)-High
    DVWA-6.2 Insecure CAPTCHA(不安全的验证码)-Medium
    DVWA-6.1 Insecure CAPTCHA(不安全的验证码)-Low
    DVWA-5.4 File Upload(文件上传)-Impossible
    DVWA-5.3 File Upload(文件上传)-High-绕过文件类型限制
    DVWA-5.2 File Upload(文件上传)-Medium-绕过文件类型限制
  • 原文地址:https://www.cnblogs.com/doublesong/p/3360972.html
Copyright © 2011-2022 走看看