Compartilhar via


Object.GetHashCode Método

Definição

Serve como a função de hash padrão.

public:
 virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

Retornos

Um código hash do objeto atual.

Comentários

Para obter mais informações sobre essa API, consulte Comentários de API complementares para Object.GetHashCode.

Notas aos Herdeiros

Uma 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 geralmente são específicas para cada tipo e, para exclusividade, devem usar pelo menos um dos campos de instância como entrada. Os códigos de hash não devem ser calculados usando os valores de campos estáticos.

Para classes derivadas de Object, o GetHashCode método pode delegar à implementação da classe GetHashCode() base somente se a classe derivada definir a igualdade como igualdade de referência. A implementação padrão de para tipos de GetHashCode() referência retorna um código hash equivalente ao retornado pelo GetHashCode(Object) método . Você pode substituir GetHashCode() por tipos de referência imutáveis. Em geral, para tipos de referência mutáveis, você só deverá substituir GetHashCode() se:

  • Você pode calcular o código hash de campos que não são mutáveis; Ou

  • Você pode garantir que o código hash de um objeto mutável não seja alterado enquanto o objeto estiver contido em uma coleção que depende de seu código hash.

Caso contrário, você pode pensar que o objeto mutável é perdido na tabela de hash. Se você optar por substituir GetHashCode() por um tipo de referência mutável, sua documentação deverá deixar claro que os usuários do seu tipo não devem modificar valores de objeto enquanto o objeto estiver armazenado em uma tabela de hash.

Para tipos de valor, GetHashCode() fornece uma implementação de código hash padrão que usa reflexão. Você deve considerar substituí-lo por um melhor desempenho.

Para obter mais informações e exemplos que computam códigos de hash de várias maneiras, consulte a seção Exemplos.

Uma função de hash deve ter as seguintes propriedades:

  • Se dois objetos forem comparados como iguais, o GetHashCode() método para cada objeto deverá retornar o mesmo valor. No entanto, se dois objetos não forem comparados como iguais, os GetHashCode() métodos para os dois objetos não precisarão retornar valores diferentes.

  • O GetHashCode() método de um objeto deve retornar consistentemente o mesmo código hash, desde que não haja nenhuma modificação no estado do objeto que determine o valor retornado do método System.Object.Equals do objeto. Observe que isso é verdadeiro apenas para a execução atual de um aplicativo e que um código hash diferente pode ser retornado se o aplicativo for executado novamente.

  • Para obter o melhor desempenho, uma função de hash deve gerar uma distribuição uniforme para todas as entradas, incluindo entradas fortemente clusterizados. Uma implicação é que pequenas modificações no estado do objeto devem resultar em grandes modificações no código hash resultante para obter o melhor desempenho da tabela de hash.

  • As funções de hash devem ser baratas para computação.

  • O GetHashCode() método não deve gerar exceções.

Por exemplo, a implementação do GetHashCode() método fornecido pela String classe retorna códigos de hash idênticos para valores de cadeia de caracteres idênticos. Portanto, dois String objetos retornarão o mesmo código hash se representarem o mesmo valor de cadeia de caracteres. Além disso, o método usa todos os caracteres na cadeia de caracteres para gerar uma saída razoavelmente distribuída aleatoriamente, mesmo quando a entrada é clusterizado em determinados intervalos (por exemplo, muitos usuários podem ter cadeias de caracteres que contêm apenas os 128 caracteres ASCII inferiores, mesmo que uma cadeia de caracteres possa conter qualquer um dos 65.535 caracteres Unicode).

Fornecer uma boa função de hash em uma classe pode afetar significativamente o desempenho da adição desses objetos a uma tabela de hash. Em uma tabela de hash com chaves que fornecem uma boa implementação de uma função de hash, a pesquisa de um elemento leva tempo constante (por exemplo, uma operação O(1). Em uma tabela de hash com uma implementação ruim de uma função de hash, o desempenho de uma pesquisa depende do número de itens na tabela de hash (por exemplo, uma operação O(n), em n que é o número de itens na tabela de hash). Um usuário mal-intencionado pode inserir dados que aumentam o número de colisões, o que pode prejudicar significativamente o desempenho de aplicativos que dependem de tabelas de hash, nas seguintes condições:

  • Quando as funções de hash produzem colisões frequentes.

  • Quando uma grande proporção de objetos em uma tabela de hash produz códigos de hash iguais ou aproximadamente iguais um ao outro.

  • Quando os usuários inserem os dados dos quais o código hash é calculado.

Classes derivadas que substituem GetHashCode() também devem substituir Equals(Object) para garantir que dois objetos considerados iguais tenham o mesmo código de hash; caso contrário, o Hashtable tipo pode não funcionar corretamente.

Aplica-se a

Confira também