문제

가능한 중복:
재정의된 System.Object.GetHashCode에 가장 적합한 알고리즘은 무엇입니까?

이것은 우리가 Equals 의 방법 Object 사용자 정의 유형에서는 다음 구현을 재정의하고 제공해야 합니다. GetHashCode 지원에 사용할 고유한 해시 코드 생성을 지원하는 방법 Hashtable 그리고 Dictionary 컬렉션 클래스일 수도 있고 다른 클래스일 수도 있습니다.

이는 우리 내부에서 사용되는 해싱 알고리즘의 구현을 요구합니다. overriden GetHashCode 방법이 최적이고 정확합니다.이는 해당 유형의 고유한 해시를 생성하고 해당 유형을 사용하는 애플리케이션의 성능을 향상시키기 위해 가능한 한 빨리 이를 수행합니다.

내 질문은 어떤 해싱 알고리즘 정확하고 최적의 성능을 제공합니다. GetHashCode 구현?아니면 기본 유형만 사용해야 할까요? GetHashCode 구현?두 가지 모두에 대한 답변을 알고 싶습니다. value types 그리고 reference types..

편집하다:다음은 재정의해야 하는 이유에 대한 아래 클래스의 예입니다. Equals:

public class Laptop : LaptopBase
{
    public readonly string Make;
    public readonly string ProcessorArch;
    public readonly int MemorySupported;
    public readonly int HardDiskGBSupported;
    public readonly Color ColorName;

    public Laptop(make, procArch, memorySupp, hdGB, color)
    {
        Make = make;
        ProcessorArch = procArch;
        MemorySupported = memorySupp;
        HardDiskGBSupported = hdGB;
        ColorName = color;
    }
}

이제 위에 정의된 모든 필드가 서로 일치하는 2개의 노트북 인스턴스에 대해 true를 반환하려고 합니다. Equals 그리고 GetHashCode 보시다시피 메서드와 또 다른 요구 사항은 이것이 파생 클래스이고 추가로 재사용될 수 있으며 다양한 메서드를 지원할 수 있다는 것입니다.따라서 값 유형(구조체)으로 만들 수 없습니다.일치하는 모든 인스턴스 필드를 사용하여 위 유형의 인스턴스 2개를 사용해 보았고 기본 구현을 사용하는 경우 Equals - 돌아온다 false 내가 원하는 곳에 true.. 그러한 시나리오를 어떻게 지원합니까?

도움이 되었습니까?

해결책

구현되는 유형에 따라 다르지만 값이 잘 분산되어야 하며 GetHashCode()가 고유한 값을 반환해야 하는 것은 아닙니다.이는 Equals 구현에 사용되는 필드를 기반으로 해야 하며 해당 필드는 변경할 수 없어야 합니다.따라서 Equals/GetHashCode에 대한 요구 사항은 구조체와 클래스에서 동일합니다.

Henk가 말했듯이 Equals/GetHashCode를 전혀 재정의하지 않는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top