Um código de hash é um valor numérico que é usado para identificar um objeto durante o teste de igualdade. Ele também pode servir como um índice para um objeto em uma coleção.
O Método GetHashCode é adequado para uso em algoritmos hash e estruturas de dados, como uma tabela de hash.
A implementação padrão do método GetHashCode não oferece garantia de exclusividade para valores de retorno para objetos diferentes. Além disso, o.NET Framework não garante a implementação padrão da GetHashCode método e o valor retornado será o mesmo entre diferentes versões do.NET Framework. Conseqüentemente, a implementação padrão desse método não deve ser usada como um identificador de objeto exclusivo para fins de hash.
O GetHashCode método pode ser substituído por um tipo derivado. Tipos de valor devem substituir esse método para fornecer uma função de hash é apropriada para esse tipo de e para fornecer uma distribuição úteis em uma tabela de hash. Exclusividade, o código hash deve ser baseado no valor de um campo de instância ou propriedade em vez de um campo estático ou propriedade.
Objetos usados como uma chave em um Hashtable objeto também deverá substituir o GetHashCode método porque esses objetos devem gerar seu próprio código de hash. Se um objeto usado como uma chave não fornecer uma implementação útil do GetHashCode, você pode especificar um provedor de código hash quando a Hashtable objeto é construído. Antes de.NET Framework versão 2.0, o provedor de código hash foi baseado na System.Collections.IHashCodeProvider interface. A partir da versão 2.0, o provedor de código hash se baseia o System.Collections.IEqualityComparer interface.
Observações para implementadoresUma função de hash é usada para gerar rapidamente um número (código hash) que corresponde ao valor de um objeto. As funções de hash são geralmente específicas a cada Type e, para que a exclusividade, deve usar pelo menos um dos campos de instância como entrada.
Uma função de hash deve ter as seguintes propriedades:
Se dois objetos comparam como iguais, o GetHashCode método para cada objeto deve retornar o mesmo valor. No entanto, se dois objetos compara como igual, o GetHashCode não têm métodos do objeto de dois retornar valores diferentes.
O GetHashCode método para um objeto consistentemente deve retornar o mesmo código de hash, desde que não há nenhuma modificação para o estado do objeto que determina o valor de retorno do objeto Equals método. Observe que isso vale apenas para a execução atual de um aplicativo e um código hash diferentes pode ser retornado se o aplicativo é executado novamente.
Para melhor desempenho, uma função de hash deve gerar uma distribuição aleatória para todas as entradas.
Por exemplo, a implementação da GetHashCode método fornecido pelo String classe retorna os códigos de hash idênticos para valores de seqüência de caracteres idêntica. Portanto, dois String objetos para retornar o mesmo código de hash se eles representam o mesmo valor de seqüência de caracteres. Além disso, o método usa todos os caracteres na seqüência de caracteres para gerar a saída distribuída razoavelmente aleatoriamente, mesmo quando a entrada está em cluster em determinados intervalos (por exemplo, muitos usuários podem ter seqüências que contêm apenas inferiores 128 caracteres ASCII, mesmo que uma seqüência pode conter nenhum dos caracteres Unicode 65.535).
Para derivado classes de Object, o GetHashCode método pode delegar para o Object.GetHashCode implementação, se e somente se que o classe derivada define igualdade do valor a ser igualdade de referência e o tipo não é um valor tipo.
Fornecer uma função hash boa em uma classe pode afetar significativamente o desempenho de adicionar esses objetos a uma tabela de hash. Em uma tabela de hash com uma boa implementação de uma função de hash, procurando por um elemento demora constante (por exemplo, uma operação de O(1)). Em uma tabela de hash com uma implementação deficiente de uma função de hash, o desempenho de uma pesquisa depende do número de itens na tabela de hash (por exemplo, um O (n) operação, onde n é o número de itens na tabela de hash). Funções de hash também devem ser baratas de computação.
Implementações de GetHashCode método não deve resultar em referências circulares. Por exemplo, se ClassA.GetHashCode chamadas ClassB.GetHashCode, ClassB.GetHashCode não deve chamar ClassA.GetHashCode direta ou indiretamente.
Implementações de GetHashCode método não deve lançar exceções.
Classes que substituem derivadas GetHashCode também deverá substituir Equals para garantir que dois objetos considerados iguais têm o mesmo código hash; Caso contrário, o Hashtable tipo pode não funcionar corretamente.