hashCode(Object obj)equals(Object obj)Object클래스가 가지는 메서드중 하나이다.

hash functions

  • hash function 𝒉 hash-key를 입력으로 받아 bucket number를 출력하는 함수
  • bucket number 0부터 B-1의 값을 가지는 정수 (B는 bucket의 수)
  • hash key 어떤 data type이든 가능하다.

hash function 𝒉는 hash-key무작위 추출(randomize)한다.

즉, 𝒉는 적당한 수의 hash-key들을 B개의 bucket으로 거의 균일하게 대응시킨다.

hash-key의 수가 B보다 작은 경우 모든 hash-key를 각 bucket으로 균일하게 대응시킬 수 없다. 이는 적당한(reasonable) 수가 아니다.
일반적으로 hash code가 동일한 객체가 존재하는 것이 가능하다.

hash function

hash function을 이용한 hashing 기법은 대량의 데이터를 저장하고 검색하는 데 유용하다.
찾는 값의 hash-key를 입력하면 그 값이 저장된 위치(bucket)를 알려주는 hash code를 반환한다.
해당 bucket에서만 값을 탐색하면 되기 때문에 일반적으로 linear search, binary search보다 빠르다.

example

int hashFunction(int hashKey) {
	return hashKey % 5;
}

위의 함수는 임의의 입력에 대해 5개의 bucket을 생성한다.
modulo operation을 이용해 해시함수를 만드는 경우에는 소수를 사용하는 것이 좋다.

hashCode

이 메서드는 hash function을 구현한 것이다.

Object 클래스에 정의된 hashCode 메서드는 객체의 주소값을 사용해 hash code를 만들어 반환한다.

  • 32-bit JVM - 객체와 hash code값이 일대일대응
  • 64-bit JVM - hash code값이 중복될 수 있다.

64-bit JVM에서는 8bytes 주소값을 사용하는데 이 값으로 4bytes hash code를 만들기 때문이다.

두 객체의 같고 다름을 필드 값을 기준으로 결정하고 싶다면 equals 메서드 뿐만 아니라 hashCode 메서드도 오버라이딩해야 한다.
해싱기법을 사용하는 HashMap이나 HashSet과 같은 클래스는 내부적으로 hashCode 메서드를 사용해 두 객체가 같은지 다른지 판단하기 때문이다.

hashCode 메서드를 오버라이딩할 때에는 주로 Objects.hash(...) 메서드를 사용한다.

equals

참조변수의 주소값을 비교한다.

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

equals 함수는 위와 같이 정의되어 있다.

public class Study {

    public static void main(String[] args) {

        Value v1 = new Value(10);
        Value v2 = new Value(10);

        if (v1.equals(v2))
            System.out.println("true");
        else
            System.out.println("false");

    }
}

class Value {
    private int value;

    public Value(int value) {
        this.value = value;
    }
}

위의 코드에서 v1이 가리키는 객체와 v2가 가리키는 객체는 필드 값이 10으로 똑같지만 주소값이 다르기 때문에 결과는 false이다.
객체의 주소가 아닌 필드값을 기준으로 같고 다름을 판단하고 싶다면 equals 메서드를 오버라이딩하면 된다.

class Value {
    private int value;

    public Value(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        return (this.value == ((Value)obj).value);
    }
}

references

Comments