Pergunta

Possível duplicata:
Qual é o melhor algoritmo para um System.Object.GetHashCode substituído?

Sabemos que se substituirmos o Equals método de Object em nossos tipos personalizados, também devemos substituir e fornecer uma implementação de GetHashCode método para suportar a geração de códigos hash exclusivos para uso no suporte de Hashtable e Dictionary classes de coleção e podem ser outras classes.

Isso exige nossa implementação do algoritmo de hashing usado dentro de nosso overriden GetHashCode o método é ideal e preciso, ou seja,ele gera um hash exclusivo do tipo e também faz isso o mais rápido possível para melhorar o desempenho do aplicativo que utiliza nosso tipo.

Minha pergunta é quais algoritmos de hash são precisos e oferecem desempenho ideal quando usados ​​em GetHashCode implementação?Ou devemos usar apenas o tipo base GetHashCode implementação?Gostaria de saber essa resposta para ambos value types e reference types..

Editar:Aqui está um exemplo de classe abaixo sobre por que eu precisaria substituir 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;
    }
}

Agora, quero retornar verdadeiro para 2 instâncias de laptop que tenham todos os campos definidos acima correspondentes entre si, de modo que seja necessário substituir o Equals e GetHashCode método e também outro requisito, como você pode ver, é que esta é uma classe derivada e pode ser reutilizada posteriormente e suportar vários métodos;e, portanto, não pode ser transformado em um tipo de valor (struct).Tentei com 2 instâncias do tipo acima com todos os campos de instância correspondentes e se eu usar a implementação base de Equals - ele retorna false onde eu quero que esteja true.. Como eu apoiaria tal cenário?

Foi útil?

Solução

Depende do tipo em que é implementado, mas deve fornecer uma boa dispersão de valores e NÃO é obrigatório que GetHashCode() retorne valores únicos.Ele deve se basear nos campos usados ​​na implementação do Equals e esses campos devem ser imutáveis.Portanto, os requisitos para Equals/GetHashCode são os mesmos para estruturas e classes.

E como Henk disse, é melhor não substituir Equals/GetHashCode...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top