다음을 통해 공유


Object.GetHashCode 메서드

특정 형식에 대한 해시 함수로 사용되며 GetHashCode는 해시 알고리즘 및 해시 테이블과 같은 데이터 구조에 사용하기 적당합니다.

네임스페이스: System
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
Public Overridable Function GetHashCode As Integer
‘사용 방법
Dim instance As Object
Dim returnValue As Integer

returnValue = instance.GetHashCode
public virtual int GetHashCode ()
public:
virtual int GetHashCode ()
public int GetHashCode ()
public function GetHashCode () : int

반환 값

현재 Object의 해시 코드입니다.

설명

이 메서드는 파생된 클래스에서 재정의할 수 있습니다. 값 클래스에서는 클래스에 적절하고 해시 테이블에서 잘 배포될 수 있는 해시 함수를 제공하도록 이 메서드를 재정의해야 합니다. 해시 테이블에서 키로 사용되는 개체는 이 메서드를 통해 개별적으로 해시 코드를 생성해야 하기 때문에 해시 테이블에서 키로 사용될 수 있는 클래스도 이 메서드를 재정의해야 합니다. 그러나 키로 사용되는 개체에서 GetHashCode의 유용한 구현을 제공하지 않으면, Hashtable이 생성될 때 System.Collections.IHashCodeProvider 인터페이스를 기초로 하는 다른 해시 코드 공급자를 제공할 수 있습니다.

GetHashCode의 기본 구현은 고유성과 일관성을 보장하지 않습니다. 따라서 해시하기 위해 고유 개체 식별자로 사용해서는 안 됩니다. 파생된 클래스는 고유 해시 코드를 반환하는 구현으로 GetHashCode를 재정의해야 합니다. 가장 좋은 결과를 얻기 위해서는 해시 코드가 정적 필드나 속성 대신 인스턴스 필드나 속성의 값을 기초로 해야 합니다.

구현자 참고 사항 해시 함수는 개체의 값에 해당하는 숫자(해시 코드)를 빠르게 생성하기 위해 사용됩니다. 일반적으로 해시 함수는 각 Type에 대해 지정되며 인스턴스 필드 중 적어도 하나가 입력되어야 합니다. 해시 함수는 다음 속성을 가져야 합니다.

  • 형식이 동일한 두 개체가 동일한 값을 나타내면 해시 함수에서는 두 개체에 대해 동일한 상수 값을 반환해야 합니다.

  • 최상의 성능을 얻으려면 해시 함수는 모든 입력에 대해 무작위 분포를 생성해야 합니다.

  • 또한 개체에 대한 변경 내용과는 상관 없이 동일한 값을 반환해야 합니다.

예를 들어, String 클래스에서 구현되는 GetHashCode는 고유한 문자열 값에 대해 고유한 해시 코드를 반환합니다. 따라서 두 String 개체가 동일한 문자열 값을 나타내는 경우에는 두 개체에 대해 동일한 해시 코드가 반환됩니다. 또한 이 메서드는 클러스터링된 문자(문자열에 65.535 개의 문자를 사용할 수 있는데도 이보다 적은 128 ASCII 문자를 사용한 경우)가 입력된 경우에는 해당 문자열의 모든 문자를 사용하여 무작위 분포된 출력을 생성합니다. GetHashCode는 개체의 특정 인스턴스에 대해 항상 동일한 값을 반환해야 합니다. Object의 파생 클래스인 경우, 파생 클래스에서 값 일치를 참조 일치로 정의하고 또한 형식이 값 형식이 아닌 경우에만 GetHashCodeObject.GetHashCode 구현에 위임할 수 있습니다. 적절한 해시 함수를 클래스에서 사용하면 개체를 해시 테이블에 추가했을 때의 성능을 향상시킬 수 있습니다. 잘 구현된 해시 함수가 들어 있는 해시 테이블에서는 특정 요소를 검색하는 데 항상 일정한 시간(예: O(1) 연산)이 소요됩니다. 반면, 잘 구현되지 않은 해시 함수가 들어 있는 해시 테이블에서 검색 속도는 해시 테이블에 들어 있는 항목 수에 비례합니다(예: O(n) 연산-여기서 n은 해시 테이블의 항목 수). 해시 함수를 사용하는 데 들어가는 비용도 적어야 합니다. GetHashCode의 구현은 결과가 순환 참조여서는 안 됩니다. 예를 들어 ClassA.GetHashCode에서 ClassB.GetHashCode를 호출하면 ClassB.GetHashCode는 직접 또는 간접적으로든 ClassA.GetHashCode를 호출해서는 안 됩니다. GetHashCode의 구현은 예외를 throw할 수 없습니다. 동일한 두 개체가 동일한 해시 코드를 가질 수 있도록 하려면 GetHashCode를 재정의하는 파생 클래스는 Equals도 재정의해야 합니다. 그렇지 않으면 Hashtable이 제대로 작동하지 않을 수 있습니다.

예제

GetHashCode는 경우에 따라서는 단순히 정수 값을 반환하도록 구현될 수 있습니다. 다음 코드 예제에서는 정수 값을 반환하도록 구현된 GetHashCode를 보여 줍니다.

using System;

public struct Int32 {
   public int value;

   //other methods...

   public override int GetHashCode() {
      return value;
   }
}
using namespace System;
public value struct Int32
{
public:
   int value;

   //other methods...
   virtual int GetHashCode() override
   {
      return value;
   }

};
import System.*;
public class Int32
{
    public int value;

    //other methods...
    public int GetHashCode()
    {
        return value;
    } //GetHashCode
} //Int32

일반적으로 형식에는 해시 코드를 생성하는 데 사용될 수 있는 여러 데이터 필드가 있습니다. 해시 코드를 생성할 수 있는 방법 중 하나는 다음 코드 예제에서와 같이 XOR (eXclusive OR) 연산을 통해 이들 필드를 조합하는 것입니다.

using System;

public struct Point {
   public int x;
   public int y; 

   //other methods
   
   public override int GetHashCode() {
      return x ^ y;
   }
}
using namespace System;
public value struct Point
{
public:
   int x;
   int y;

   //other methods
   virtual int GetHashCode() override
   {
      return x ^ y;
   }

};

다음 코드 예제에서는 XOR (eXclusive OR) 연산을 통해 형식의 필드를 조합하여 해시 코드를 생성하는 다른 방법을 보여 줍니다. 코드 예제에서 볼 수 있듯이 각 필드는 GetHashCodeEquals를 구현하는 사용자 정의된 형식을 나타냅니다.

using System;

public class SomeType {
   public override int GetHashCode() {
     return 0;
   }
}

public class AnotherType {
   public override int GetHashCode() {
     return 1;
   }
}

public class LastType {
   public override int GetHashCode() {
     return 2;
   }
}

public class MyClass {
   SomeType a = new SomeType();
   AnotherType b = new AnotherType();
   LastType c = new LastType();

   public override int GetHashCode () {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}
using namespace System;
public ref class SomeType
{
public:
   virtual int GetHashCode() override
   {
      return 0;
   }

};

public ref class AnotherType
{
public:
   virtual int GetHashCode() override
   {
      return 1;
   }

};

public ref class LastType
{
public:
   virtual int GetHashCode() override
   {
      return 2;
   }

};

public ref class MyClass
{
private:
   SomeType^ a;
   AnotherType^ b;
   LastType^ c;

public:
   virtual int GetHashCode() override
   {
      return a->GetHashCode() ^ b->GetHashCode() ^ c->GetHashCode();
   }

};
import System;

public class SomeType {
   public override function GetHashCode(): int  {
     return 0;
   }
}

public class AnotherType {
   public override function GetHashCode(): int {
     return 1;
   }
}

public class LastType {
   public override function GetHashCode(): int {
     return 2;
   }
}

public class MyClass {
   var a: SomeType  = new SomeType();
   var b: AnotherType = new AnotherType();
   var c: LastType = new LastType();

   public override function GetHashCode () : int {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}

파생 클래스의 데이터 멤버가 Int32보다 크면, 다음 코드 예제에서와 같이 XOR (eXclusive OR) 연산을 사용하여 값의 상위 비트와 하위 비트를 조합할 수 있습니다.

using System;

public struct Int64 {
   public long value;

   //other methods...

   public override int GetHashCode() {
      return ((int)value ^ (int)(value >> 32));
   }
}
using namespace System;
public value struct Int64
{
public:
   long value;

   //other methods...

   virtual int GetHashCode() override
   {
      return ((int)value ^ (int)(value >> 32));
   }
};
import System;

public class Int64 {
   var value : long;

   //other methods...

   public override function GetHashCode() : int {
      return (int(value) ^ int(value >> 32));
   }   
   
   function Int64(myValue : long) {
      value = myValue;
   }
}

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

Object 클래스
Object 멤버
System 네임스페이스
Hashtable

기타 리소스

Hashtable 및 Dictionary 컬렉션 형식