2009-12-11 2 views
0

유니크 해시을 모든 개체에서 가져오고 싶습니다. C# 모든 개체에서 고유 한 해시 가져 오기

  • foo는 [someKey]
  • foo는
  • 을 MyObject에

    • 문자열
    • MyObject를
    • 속성 :

      Dictionary<string, MyObject> foo 
      

      의 경우 더 무엇, 나는 고유 키를 원하는

    개체 .GetHashCode()는 다른 개체에 대해 고유 한 반환 값을 보장하지 않습니다. 그게 내가 필요한거야.

    아이디어가 있으십니까? 고마워요

    +4

    그것은 어려울 것입니다. 가능하지만 어렵고 비용이 많이 드는 자원. 왜 그런 메커니즘을 원했는지 설명 할 수 있습니까? 당신이 원하는 것을 할 수있는 더 좋은 방법이있을 것입니다. –

    답변

    3

    단순히 넣을 수 없습니다. GetHashCode 함수는 2^32 개의 가능한 고유 값을 포함하는 부호있는 정수를 반환합니다. 64 비트 플랫폼에서는 2^32 개 이상의 서로 다른 객체를 실행할 수 있으므로 모두 고유 한 해시 코드를 가질 수는 없습니다.

    이 방법에 접근하는 유일한 방법은 실행중인 시스템에서 생성 될 수있는 값의 수보다 크거나 같은 용량의 유형을 반환하는 다른 해싱 함수를 만드는 것입니다.

    2

    입력 공간에 제약이 없으면 고유 한 해시 코드를 사용할 수 없습니다. 이는 Object.GetHashCodeint이기 때문입니다. Int32.MaxValue 개 이상의 객체가있는 경우 두 개 이상이 동일한 해시 코드 (pigeonhole principle)에 매핑되어야합니다.

    입력이 제한된 맞춤 유형 (즉, 균등성까지 가능한 다른 객체 수가 Int32.MaxValue 미만)을 정의한 다음 고유 한 해시 코드를 생성 할 수 있습니다. 그것은 쉽고, 가능한 일이라는 것을 말하는 것이 아닙니다.

    또는 Object.GetHashCode 메커니즘을 사용하지 말고 대신 해시를 나타내는 다른 방법을 사용하면 원하는 작업을 수행 할 수 있습니다. 우리는 당신이 원하는 것을 명확하게 설명하고 여기에서 당신을 도울 수 있기 위해 그것을 사용하고 있습니다.

    4

    "고유 해시"는 일반적인 용어로도 일반적으로 모순입니다 (해시 값으로 Int32을 사용하려는 경우에는 분명히 불가능합니다). 위키 피디 항목에서 :

    해시 함수 작은 데이텀에 데이터의 큰 가능성 가변 크기의 양을 변환 어떤 잘 정의 절차 또는 수학적 함수 보통 단일 정수 는 그 배열 에 대한 색인으로 사용될 수 있습니다. 해시 함수에 의해 반환 된 값을 해시 값, 해시 코드, 해시 합계 또는 단순히 해시라고합니다.

    "작은 데이터"비트 - 가능한 해시 값보다 많은 가능한 개체가 있으므로 고유성을 가질 가능성이 없습니다.

    이제 실제로 해시를 문자열로 지정하는 것처럼 들리 겠지만 ... 고정 된 크기가 아니란 것을 의미합니다 (단 은 2GB 이하 여야하며 제한이 무엇이든간에). 이 "고유 해시"를 생성하는 가장 간단한 방법은 객체를 직렬화하고 결과를 문자열로 변환하는 것입니다. 바이너리 직렬화 형식 인 경우 Base64를 사용하거나 JSON과 같은 텍스트 기반 텍스트 인 경우 텍스트 만 사용하십시오. 그러나 그 누구도 실제로 "해시"로 인식하지 않습니다.

    +0

    그렇다면 제대로 표현하지 못했습니다. 그것은 해시가 아닙니다. –

    1

    다른 사람들이 말했듯이, 해시 코드는 결코 고유하지 않습니다. 이는 중요하지 않습니다.

    정확하게 Dictionary<string, MyObject> foo이 정확한 인스턴스 을 찾는 데 도움이되는데입니다. 해시 코드를 사용하여 더 작은 개체 집합으로 검색 범위를 좁히고 동등성을 확인하십시오 ().

    고유 한 키가 필요한 경우 Guid 클래스를 사용하여 고유 한 문자열을 얻을 수 있습니다. 그러나 이것은 해시 코드가 아닙니다.

    관련 문제