hashCode는 무엇에 사용됩니까? 독특합니까?


129

나는이 알 getHashCode()수 시퀀스를 반환 WP7의 모든 컨트롤 항목에서 방법. 이 해시 코드를 사용하여 항목을 식별 할 수 있습니까? 예를 들어 장치에서 사진이나 노래를 식별하고 위치를 확인하고 싶습니다. 특정 항목에 지정된 해시 코드가 고유 한 경우 수행 할 수 있습니다.

hashCode가 무엇인지 설명하고 getHashCode()사용할 수 있습니까?


해시 코드가 무엇인지 알고, 해시 코드를 얻기 위해 코드를 여러 번 실행하려고 시도하고 매번 같은 항목에 대해 동일한 해시 코드를 반환하지만 중복되지는 않지만 확실하지 않습니다. 당신이 공감하고 싶다면 괜찮습니다. 그것은 당신의 의견입니다. 어쨌든 편집 해 주셔서 감사합니다!
Nghia Nguyen

7
에릭 리퍼 (Eric Lippert)의 GetHashCode 가이드 라인과 규칙을 읽는 것이 좋습니다 . 비록 " 설계 상 하나의 목적으로 만 유용 합니다 : 해시 테이블에 객체를 놓는 것"
Brian

답변:


108

MSDN은 말합니다 :

해시 코드는 동등성 테스트 중에 개체를 식별하는 데 사용되는 숫자 값입니다. 컬렉션의 개체에 대한 인덱스 역할을 할 수도 있습니다.

GetHashCode 메서드는 해시 알고리즘 및 해시 테이블과 같은 데이터 구조에 사용하기에 적합합니다.

GetHashCode 메서드의 기본 구현은 다른 개체에 대해 고유 한 반환 값을 보장하지 않습니다. 또한 .NET Framework는 GetHashCode 메서드의 기본 구현을 보장하지 않으며 반환되는 값은 다른 버전의 .NET Framework간에 동일합니다. 따라서이 메소드의 기본 구현을 해싱 목적으로 고유 한 오브젝트 ID로 사용해서는 안됩니다.

GetHashCode 메서드는 파생 형식으로 재정의 할 수 있습니다. 해당 유형에 적합한 해시 함수를 제공하고 해시 테이블에 유용한 분포를 제공하려면 값 유형이이 메소드를 대체해야합니다. 고유성을 위해 해시 코드는 정적 필드 또는 속성 대신 인스턴스 필드 또는 속성의 값을 기반으로해야합니다.

Hashtable 개체에서 키로 사용되는 개체도 GetHashCode 메서드를 재정의해야합니다. 이러한 개체는 자체 해시 코드를 생성해야하기 때문입니다. 키로 사용 된 개체가 GetHashCode의 유용한 구현을 제공하지 않으면 Hashtable 개체가 생성 될 때 해시 코드 공급자를 지정할 수 있습니다. .NET Framework 버전 2.0 이전에는 해시 코드 공급자가 System.Collections.IHashCodeProvider 인터페이스를 기반으로했습니다. 버전 2.0부터 해시 코드 공급자는 System.Collections.IEqualityComparer 인터페이스를 기반으로합니다.

기본적으로 해시 코드는 해시 테이블을 가능하게하기 위해 존재합니다.
두 개의 동일한 객체는 동일한 해시 코드를 갖습니다.
두 개의 동일하지 않은 객체는 동일하지 않은 해시 코드 (충돌이라고 함)를 가질 수 없습니다 .


3
MSDN에서 인용 한 내용이 최신이 아닙니다. MSDN은 이제 고유하지 않은 해시 코드에 대해 명확하지 않습니다.
user34660

248

그것이 무엇인지 배우고 나면 유추를 통해 희망적으로 더 간단한 설명을 작성한다고 생각했습니다.

요약 : 해시 코드 란 무엇입니까?

  • 지문입니다. 이 지문을 사용하여 관심있는 사람들을 식별 할 수 있습니다.

자세한 내용은 아래를 참조하십시오.

누군가를 고유하게 식별하려고하는 해시 코드를 생각하십시오.

나는 형사를 찾아 형사입니다. 우리는 그를 잔인한 사람이라고 부릅시다. (내가 어렸을 때 그는 악명 높은 살인자였습니다. 그는 집에 침입하여 가난한 소녀를 살해하고 몸을 버렸고 여전히 헐겁습니다. 그러나 그것은 별개의 문제입니다). Mr. Cruel은 사람들의 바다에서 그를 고유하게 식별하는 데 사용할 수있는 특별한 특성을 가지고 있습니다. 호주에는 2,500 만 명의 사람들이 있습니다. 그들 중 하나는 잔인입니다. 우리는 어떻게 그를 찾을 수 있습니까?

잔인한 사람을 식별하는 나쁜 방법

분명히 잔인은 파란 눈을 가지고 있습니다. 호주 인구의 거의 절반이 파란 눈을 가지고 있기 때문에 그다지 도움이되지 않습니다.

잔인한 사람을 식별하는 좋은 방법

다른 무엇을 사용할 수 있습니까? 나는 알고있다 : 나는 지문을 사용할 것이다!

장점 :

  • 두 사람이 같은 지문을 갖는 것은 정말 어렵습니다 (불가능하지는 않지만 극히 가능성은 낮음).
  • Mr. Cruel의 지문은 절대 바뀌지 않습니다.
  • Mr. Cruel의 모든 존재의 모든 부분 : 외모, 머리 색깔, 성격, 식습관 등은 (이상적으로는) 동생이있는 경우 (매우 유사하지만 동일하지 않은) 지문에 (이상적으로) 반영되어야합니다. 해야서로 다른 지문을. 우리는이 세상의 두 사람이 다른 지문을 가질 것이라고 100 % 보장 할 수 없기 때문에 "해야한다"고 말합니다.
  • 그러나 우리는 항상 Cruel 씨가 항상 같은 지문을 가질 것이라고 보장 할 수 있으며 그의 지문은 절대 변하지 않을 것입니다.

위의 특성은 일반적으로 좋은 해시 함수를 만듭니다.

'충돌'과의 거래는 무엇입니까?

제가 리드를 얻었고 Cruel의 지문과 일치하는 사람이 있다고 생각합니다. 이것이 내가 Cruel을 찾았 음을 의미합니까?

........혹시! 좀 더 자세히 살펴 봐야합니다. SHA256 (해싱 함수)을 사용하고 5 명만있는 작은 마을을 찾고 있다면 그를 찾을 수있는 좋은 기회가 있습니다! 그러나 MD5 (또 다른 유명한 해싱 함수)를 사용하고 + 2 ^ 1000 명의 사람들이있는 마을에서 지문을 확인하는 경우 완전히 다른 두 사람이 동일한 지문을 가질 가능성이 상당히 높습니다.

어쨌든이 모든 것의 이점은 무엇입니까?

해시 코드의 유일한 장점은 해시 테이블에 무언가를 넣고 싶을 때-해시 테이블을 사용하여 객체를 빨리 찾고 싶을 때-해시 코드가 들어오는 곳입니다. 해시 테이블에서 실제로 물건을 찾을 수 있습니다 빨리. 성능을 크게 향상 시키지만 정확도는 낮지 만 해킹입니다.

호주에 2,500 만 명의 용의자가있는 사람들로 가득 찬 해시 테이블이 있다고 가정 해 봅시다. 미스터 잔인 어딘가에 ..... 어떻게 빨리 찾을 있을까요? 우리는 그것들을 모두 정리해야합니다 : 잠재적 인 일치를 찾거나 잠재적 인 용의자를 사로 잡기 위해. 시간이 너무 오래 걸리기 때문에 각 사람의 고유 한 특성을 고려하고 싶지 않습니다. 대신 무엇을 사용 하시겠습니까? 해시 코드를 사용하십시오! 해시 코드는 두 사람이 다른지 알려줍니다. Joe Bloggs가 잔인하지 않은지 여부 지문이 일치하지 않으면 잔인한 것이 아닙니다. 그러나 지문 이 일치하면그리고 당신이 사용한 해시 함수에 따라, 당신이 당신의 남자를 찾은 기회는 이미 상당히 좋습니다. 그러나 100 %는 아닙니다. 당신이 확신 할 수있는 유일한 방법은 다음을 더 조사하는 것입니다.

두 개체의 해시 코드 값이 동일한 컴퓨터를 사용하는 경우 다시 동일한 개체인지 조사해야합니다. 예를 들어 객체의 높이, 무게 등이 같은지, 정수가 같은지 또는 customer_id가 일치하는지 확인한 다음 동일한 지 여부를 판단해야합니다. 이것은 일반적으로 IComparer 또는 IEquality 인터페이스를 구현하여 수행됩니다.

주요 요약

기본적으로 해시 코드는 지문입니다.

디지털 지문-그림 속성 ×-https://pixabay.com/en/finger-fingerprint-security-digital-2081169/에서 자유롭게 사용 가능

  1. 두 개의 다른 사람 / 물체는 이론적으로 여전히 동일한 지문을 가질 수 있습니다. 다른 말로하면 동일한 지문이 두 개있는 경우 동일한 사람 / 물체에서 나올 필요는 없습니다.
  2. Buuuuuut, 같은 사람 / 객체 는 항상 같은 지문을 반환합니다 .
  3. 즉, 두 객체가 다른 해시 코드를 반환 하면 해당 객체가 다르다는 것을 100 % 확실하게 알 수 있습니다.

위의 내용을 숙지하려면 3 분 정도 걸립니다. 아마도 이해가 될 때까지 몇 번 읽었을 것입니다. 나는 그것이 모든 것을 배우기 위해 많은 슬픔이 필요했기 때문에 이것이 누군가를 돕기를 바랍니다!


1
Re : MSDN 설명서는 뇌 세포 중 일부를 죽였습니다 . 내가 잠들었 기 때문에 만 저장;)
Shwrk

마지막에 별표 주석으로 멋진 설명을 완전히 파괴했습니다.
Waldemar Gałęzinowski

나는 그것을 좋아했다! 주로 "Mr.Cruel!"
João Pedro Andrade Marques

진정한 범죄 팬으로서 이것은 아마도 내가 가장 좋아하는 SO 답변 일 것입니다 ...
IfElseTryCatch

11

GetHashCode()해시 테이블의 키로 객체 사용을 지원하는 데 사용됩니다. (자바에도 비슷한 것이 존재합니다). 모든 객체가 고유 한 해시 코드를 반환하는 것이 목표이지만, 이것이 절대적으로 보장되는 것은 아닙니다. 그것은되어 필요한 두 개의 논리적으로 동일한 개체가 반환하지만 같은 해시 코드를.

일반적인 해시 테이블 구현은 hashCode 값으로 시작하여 모듈러스 (범위 내의 값을 제한)를 가져 와서 "버킷"배열의 인덱스로 사용합니다.


8

WP7에는 고유하지 않으며 모든 .Net 객체에 존재합니다. 그것은 당신이 묘사 한 것을 수행하지만, 고유하지는 않기 때문에 앱에서 고유 식별자로 권장하지 않습니다.

Object.GetHashCode 메서드


4

이것은 msdn 기사에서 온 것입니다.

https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

"사람들이 해시 코드가 주어진 입력에 대해 고유 한 값을 생성한다고 말하는 것을들을 수 있지만 실제로는 달성 하기는 어렵지만 동일한 값으로 해시되는 두 개의 서로 다른 데이터 입력을 찾는 것이 기술적으로 가능합니다 . 해시 알고리즘의 효과에 관한 결정 요소는 생성 된 해시 코드의 길이와 해시되는 데이터의 복잡성에있다. "

따라서 데이터 크기에 적합한 해시 알고리즘을 사용하면 고유 한 해시 코드가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.