C# GetHashCode() Algoritmo de hash de alto desempenho [duplicado]
-
11-12-2019 - |
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?
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...