2017-03-09 5 views
1

메모리 캐시 된 데이터 구조를 인턴 된 문자열 집합과 연관시키고 인계 된 문자열 인스턴스를 사용하여 연관된 데이터 구조를 조회하려고합니다.인턴 된 문자열에 의해 키가되는 사전의 키

사전 정의 된 문자열 세트는 약 1000 개입니다. 캐시 인구 비용은 무시할 수 있지만 고성능 조회를 원합니다.

public class InternedExtras 
{ 
    public DateTime Prop1 {get; set; } 
    public Decimal Prop2 {get; set; } 
} 

이상적으로 나는 인턴 된 문자열의 참조에 대해 키를 만듭니다. 닷넷은 개체 참조를 특정 형식으로 노출하지 않습니다.

나는 나의 사전을 선언하는 경우 :

Dictionary<string, InternedExtras> 

그때 나는 선택 System.String 평등 재정의 비효율적이 될 것입니다 사전 검색 중에 문자 문자열 값을 비교하여 문자를 호출합니다 걱정됩니다.

내가 완전히 이해 적이 없다 그러나
Dictionary<int, InternedExtras> _extrasDictionary 

InternedExtras GetInternedExtras(string knownToBeInterned) 
{ 
    return _extrasDictionary[ knownToBeInterned.GetHashCode() ]; 
} 

해시 코드 수학 및 고유성이 보장되지 이해 :

옵션이 될 것입니다.

내 인턴 된 문자열의 평균 길이는 50 자이며 최신 .Net 버전으로 배포 할 수 있습니다.

Dictionary<string, InternedExtras> _extrasDictionary; 

은 다음과 실제로 매우 효율적으로 찾고 수행 :

답변

1

는 사실이 가장 효율적인 방법입니다 생각!

InternedExtras extras = _extrasDictionary[interned]; 

참조하는 char by char 비교는 문자열의 작은 하위 집합에서만 호출됩니다. 이는 interned.GetHashCode()이 키를 "버킷"으로 그룹화하는 데 사용되기 때문입니다.

이 질문은 주제에 대한 더 자세한 내용이 있습니다 다나 @

How does a hash table work?

+0

- 감사합니다 사전/해시 코드의 성능에 대한 확신에 대한합니다. System.String이 someString.GetHashCode 호출 사이에 문자열의 해시 코드를 저장하지 않는다고 생각하는 것이 맞습니까? – camelCase

+1

실제로 생각하지 않습니다 (아래 소스 코드 참조). '사전 '은 사실상 빠른 메모리 검색을 수행하는 방법이며 BCL (즉 Microsoft에서 구현)의 일부분이라는 것을 알고 있습니다. 의심이 간다면 몇 가지 성능 테스트를 실행해야합니다. https://referencesource.microsoft.com/#mscorlib/system/string.cs – dana