본문 바로가기
C#/책 정리

C# 정리 ) GetHashCode

2021. 11. 29.

GetHashCode 메서드는 특정 인스턴스를 고유하게 식별할 수 있는 4바이트 int 값을 반환한다.

GethashCode와 Equals 메서드를 연계해서 사용할 수 있다.

 

Equals 값이 True라면 같은 객체인것이고, 또한 그 객체를 식별하는 [고윳값] 또한 같아야 한다.

반면 Equals 반환값이 False라면, 객체는 같더라도 GetHashCode 의 반환값도 달라야 한다.

이 때문에 보통 Equlas 메서드를 하위 클래스에 [재정의]하면 GetHashCode까지 [재정의]한다.

이를 따르지 않으면 컴파일 경고가 발생한다.

using System;

namespace Project3
{
    class Test
    {
        // 테스트용 클래스
    }
    class Class1
    {
        public static void Main(String[] args)
        {
            short n1 = 256;
            short n2 = 32750;
            short n3 = 256;
            Console.WriteLine(n1.GetHashCode());
            Console.WriteLine(n2.GetHashCode());
            Console.WriteLine(n3.GetHashCode());

            Test t1 = new Test();
            Test t2 = new Test();
            Console.WriteLine(t1.GetHashCode());
            Console.WriteLine(t2.GetHashCode());
        }
    }
}

object 에서 정의된 GetHashCode는 [참조 타입]에 대해 기본 동작을 정의해 뒀는데, 생성된 참조 타입이 살아 있는 동안 닷넷 프레임워크 내부에서 그러한 인스턴스에 부여한 식별자 값을 반환하기 때문에 프로그램이 실행되는 도중 같은 타입의 다른 인스턴스와 GetHasgCode 의 리턴값이 겹칠 가능성은 많지 않다.

 

[값 타입]에 대해서는 GetHashCode의 기본 동작을 [재정의]해서 해당 인스턴스가 동일한 값을 가지고 있다면 같은 해시코드를 리턴한다.


GetHashCode는 int, 4바이트를 리턴한다.

값의 범위가  

-2,146,483,648 ~ 2,146,483,647 로 제한된다.

short는 그냥 그 값 자체를 반환해도 다른 short 인스턴스와 겹치지(해시 충돌하지) 않을 수 있다.

 

하지만 int 는 GetHashCode와 범위가 정확히 일치하는데, 이를 통해 1:1 매핑을 할 수 있다.

닷넷 프레임워크 개발자들은 int에 대한 GetHashCode를 재정의하여 그 값을 그대로 반환하게 해두었다.

using System;

namespace Project3
{
    class Class1
    {
        public static void Main(String[] args)
        {
            int n1 = 256;
            int n3 = 256;
            Console.WriteLine(n1.GetHashCode());
            Console.WriteLine(n3.GetHashCode());
        }
    }
}

출력 결과:

256

256

 

long의 경우 int보다 범위가 넓기에 어떤 경우에는 동일한 해시 코드가 반환될 수 있다.

서로 구분되는 값인데 동일한 해시 코드를 생성하는 것을 [해시 충돌] 이라고 한다.

 

이러한 이유 때문에 Eqhals 와 GetHashCode를 같이 사용하는 것이다.

해당 객체를 고유하게 식별할 수 있는 값이 같을 수 있기 때문이다.

식별할 수 있는 값이 2개 이상 나올 수 있는 여지가 있다면, Equals를 호출해서 다시한번 객체가 동일한지 판단하는 것이다.

 

기억할 것은 GetHashCode의 경우 동일한 값이 리턴되어 해시 충돌이 발생할 여지가 있다는 것이다.

'C# > 책 정리' 카테고리의 다른 글

C# 정리 ) this  (0) 2021.11.30
C# 정리 ) System.Array  (0) 2021.11.29
C# 정리 ) Equals  (0) 2021.11.28
C# 정리 ) GetType  (0) 2021.11.28
C# 정리 ) ToString  (0) 2021.11.28

댓글