2015-02-02 2 views
0

정수, 문자열, 십진수, GUID의 9 가지 속성을 가진 객체가 있습니다.변수 모음을 체크섬하는 가장 좋은 방법은 무엇입니까?

길이가 2 백만 레코드 인이 개체의 배열이 있습니다.

다른 개체와 충돌하지 않는이 개체의 속성에 대한 문자열 해시/체크섬을 만들고 싶습니다.

C#에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 나는 concat과 md5에 대해 생각했지만 concat은 = 1b = 12 또는 a = 11b = 2 일 때 충돌을 일으킬 수 있습니다. 그들은 모두 112와 연결될 것입니다.

편집 : 아마도 CHECKSUM이 더 좋은 단어일까요? 난 그냥 빠른 비교를해야하지만 직접 개체 비교를 할 필요가, 나는 모든 분야의 가치 비교를 할 필요가있다.

+0

고유 키 사용을 고려 했습니까? –

+0

각 개체에는 고유 한 속성 집합이 있습니까? – paul

+0

Guid는 이미 전 세계적으로 고유합니다. 동일한 Guid가 여러 객체에서 재사용되지 않는 한. – kennyzx

답변

1

내가 그 최종 필요가있는 경우 모든 필드

의 값을 비교해야 할 어떤 계산 된 값은 계산 된 값은 필드 값의 조합에 대해 고유하지 않는 한, 하나의 필드를 비교 피할 수 없다 , 예를 들어 각 객체의 모든 필드 값을 연결 한 문자열을 얻지 만 문자열로 변환하면 일부가 근사값을 초래할 수 있으므로 객체 사이의 잘못된 불일치가 발생할 수 있습니다 (특히 부동 소수점 숫자 포함).

해시/체크섬 계산은 정확한 비교를위한 것이 아니고 색인 생성만을위한 것이거나 더 집중적 인 계산 (귀하의 것과 같은) 또는 다른 목표를 피하기위한 사전 점검으로 필드를 비교하는 것이 가장 정확한 것입니다 필드 별 필드는 필요하지 않습니다.

당신은 결국 필요한 경우에만 한 번 값을 계산 읽기 전용 속성을 작성하고, 같은 숨겨진 필드로 저장할 수 있습니다 : 그것은 경우

public class _Object 
    { 
     public Int32 IntField; 
     public String StringField; 
     public Decimal DecimalField; 
     public Guid GuidField; 

     private string m_UniqueKey; 
     [DebuggerBrowsable(DebuggerBrowsableState.Never)] 
     public string UniqueKey 
     { 
      get 
      { 
       if (m_UniqueKey == null) 
       { 
        m_UniqueKey = IntField.ToString() 
           + "|" + (StringField ?? string.Empty) 
           + "|" + DecimalField.ToString("F6", CultureInfo.InvariantCulture) 
           + "|" + GuidField.ToString("X"); 
       } 
       return m_UniqueKey; 
      } 
     } 
    } 

위의 코드 샘플은 (한 번만 m_UniqueKey을 계산 null), 필드 치의 separator로서 임의의 문자를 사용합니다. 또한 십진수 값을 임의의 선택된 정밀도로 형식화하려고 시도합니다.

해시/체크섬 값이 필요한 경우 GetHashCode()을 구현하고 이에 의존 할 수 있지만이 경우 중요한 모든 필드 또는 그 일부를 포함해야합니다.

감사합니다.
Daniele.

관련 문제