2012-07-18 8 views
2

가능한 중복은 :
Why might a System.String object not cache its hash code?복잡성()

나는 항상 주어진 닷넷 문자열을 변경할 수 있음을, String.GetHashCode() 해시를 계산하지 않았다 생각 호출 될 때마다 - 문자가 변경되지 않으면 해시는 System.String의 지정된 인스턴스에 대해 일정합니다. String.GetHashCode()은 O (1) 복잡성을 가질 수 있습니다.

Reverse engineering it은이 가정을 산산조각 냈습니다.

물론 해시 코드는 상수 and so on 일 수는 없지만 String 구현에서 이미 생성 된 해시 코드를 갖는 것을 막을 수있는 것은 무엇입니까?

+0

약간의 복잡성과 4 바이트의 메모리를 제외하고는 아무 것도 없습니다. – CodesInChaos

+0

나는이 질문이 오늘까지 남지 않기에는 너무 좋다고 느꼈다. 불행히도, 나는 그것을 쓰는 동안 결코 나타나지 않았습니다 ... 나는 방금 이것을 닫으려고 투표했습니다. – Humberto

답변

2

좋은 질문!

I asked the same thing a while back.

기본적으로, 속도/메모리 트레이드 오프입니다. 문자열 해시 코드 캐싱의 이점은 다른 모든 32 비트 메모리를 할당해야하는 모든 단일 문자열 객체의 오버 헤드 때문에 틀림없이 중요합니다. 이것은 프로그램에 존재할 수있는 많은 수의 문자열과 해시 코드가 신경 쓰는 번호 (아마도 키를 키로 사용하기 때문에)를 생각할 때 의미가 있습니다.

일부 프로그램에서는 후자의 숫자가 클 수도 있지만 상당히 적을 수도 있습니다. 많은 경우에 0 일 수도 있습니다.

성능은 특정 시나리오에서 당신을 위해 극단적 인 우려, 당신은 캐시에게 그것의 해시 코드 않습니다 자신의 래퍼 작성하는 것이 좋습니다했다 경우에,

public class StringKey 
{ 
    string value; 
    int hashCode; 

    public StringKey(string value) 
    { 
     this.value = value; 
     this.hashCode = value.GetHashCode(); 
    } 

    public override int GetHashCode() 
    { 
     return this.hashCode; 
    } 

    public override string ToString() 
    { 
     return this.value; 
    } 

    // Plus all the other stuff you'd want to include here, 
    // e.g., Equals, CompareTo, etc. 
} 

이 될 수있는 모든 혜택을받을하기를 물론,이 모든 것들을 기본적으로 모든 곳에서 재사용 할 때 조심해야합니다. 대다수의 경우, 이것은 노력할만한 가치가 없을 것입니다. 예외적 인 경우라면 고려해야 할 부분으로 만 아이디어를 포함 시켰습니다.

0

해시 코드가 (거의) 문자열을 만들 때마다 사용된다고 가정하면이 의미가 있습니다. 해시 코드를 사용하지 않으면 계산의 벌칙을 지불하게됩니다. 나는 인턴 된 문자열에 대해 당신에게 이것을 허용합니다. 이것은 인턴쉽의 일환으로 수행 될 수있는 한 실제로 가치있는 일이었을 것입니다.

+0

계산을 게으르게 만드는 것이 쉽습니다. – CodesInChaos

+0

@CodesInChaos 네,하지만 그건 OP가 제안하는 것이 아니며 제 대답은 질문의 맥락에 있습니다. –

0

문제는 해시 코드를 저장하는 위치라고 생각합니다. 스토리지 요구 사항을 추가하는 것은 지나치게 복잡하기 때문에 문자열 스토리지에서 많은 최적화가 수행됩니다.