2013-11-10 3 views
0

오늘 저는 C#으로 중요한 프로그램을 테스트하고 싶습니다. 이 프로그램에서 일부 속성은 GetHashCode() 메서드를 통해 해시됩니다. 프로그램의 일부를 구현 한 후에 단위 테스트 프로젝트가 추가되었습니다. 그런 다음 디버그 모드에서 프로그램을 실행하고 단위 테스트 프로젝트에서 비교할 수 있도록 메모장에 해시 된 데이터를 복사합니다. 그런 다음 디버그 모드에서 테스트 메소드를 실행하고 해시 된 데이터를 다시 가져 와서 메모장에 복사하십시오. 이 경우 고유 한 문자열 인 해시 코드 은 디버그 모드 및 단위 테스트 모드에서 동일하지 않습니다.GetHashCode 디버그 및 유닛 테스트에서 다른 결과 실행

어디에서 제기했는지 그리고 어떻게 해결해야할지 모르겠습니다.

그게 문제입니까?

답변

4

MSDN의 article에는 해시 코드를 유지하지 않아야한다는 명시적인 경고가 있습니다. 동일한 문자열 값이 응용 프로그램 도메인 외부의 동일한 해시 코드에 매핑되는 것은 아닙니다.

두 경우 스트링 객체는 메소드를 GetHashCode 동일한 값을 반환 같다. 그러나 각각 고유 한 문자열 값인 에 대한 고유 한 해시 코드 값은 없습니다. 다른 문자열은 동일한 해시 코드를 반환 할 수 있습니다.

해시 코드 자체의 안정성이 보장되지 않습니다. 의 해시 코드는 .NET Framework 의 단일 버전에 대해 .NET Framework 버전과 (32 비트 및 64 비트) 플랫폼에서 다를 수 있습니다. 어떤 경우에는 애플리케이션에 따라 다를 수도 있습니다. 도메인. 결과

가 해쉬 코드가이 만들어진 어플리케이션 도메인 외부에서 사용되어서는 안들은 은 컬렉션에서 키 필드로서 사용되지 않아야하고, 그들은 이 유지 않을 것.

마지막으로 암호화가 강력한 해시가 필요한 경우 암호화 해시 함수가 반환 한 값 대신 해시 코드를 사용하지 마십시오. 암호화 해시의 경우 System.Security.Cryptography.HashAlgorithm 또는 System.Security.Cryptography.KeyedHashAlgorithm 클래스에서 파생 된 클래스를 사용하십시오.

해시 코드에 대한 자세한 내용은 Object.GetHashCode를 참조하십시오. 테스트에 대한 그래서

, I 좋겠 중 하나 문자열의 GetHashCode는-구현이 올바른지에 의존하거나 만들고 정상 코드 string.GetHashCode를 반환하고 모의 경우로 치환되는 mockable 해시 코드 공급자를 주입 실행중인 테스트.

internal interface IHashCodeProvider 
{ 
    int ProvideHashCode(string stringValue); 
} 

더 가벼운 접근 방식이 (가)가 반환하는 함수를 삽입하는 것입니다 : "해시 코드 공급자"로, 나는 주어진 문자열의 해시 코드를 반환하는 방법, 예를 들어이있는 추상 클래스 또는 인터페이스를 의미 코드 예 : Func<string, int>. 기본 기능은 x => x.GetHashCode()입니다.

관련 문제