Object.GetHashCode Método

Definição

Serve como função de hash predefinida.

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

Devoluções

Um código hash para o objeto atual.

Observações

Para mais informações sobre esta API, consulte Observações suplementares da API para Object.GetHashCode.

Notas para Herdeiros

Uma função de hash é usada para gerar rapidamente um número (código de hash) que corresponde ao valor de um objeto. As funções de hash são geralmente específicas para cada tipo e, para unicidade, devem usar pelo menos um dos campos da 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 só pode delegar à implementação da classe GetHashCode() base se a classe derivada definir igualdade como igualdade de referência. A implementação padrão de GetHashCode() para os tipos de referência devolve um código hash equivalente ao devolvido pelo GetHashCode(Object) método. Podes sobrescrever GetHashCode() para tipos de referência imutáveis. De um modo geral, para tipos de referência mutáveis, só deve sobrescrever GetHashCode() se:

  • Podes calcular o código de hash a partir de campos que não são mutáveis; ou

  • Pode garantir que o código hash de um objeto mutável não altera enquanto o objeto está contido numa coleção que depende do seu código hash.

Caso contrário, pode pensar que o objeto mutável se perde na tabela hash. Se optar por sobrescrever GetHashCode() para um tipo de referência mutável, a sua documentação deve deixar claro que utilizadores do seu tipo não devem modificar os valores do objeto enquanto o objeto está armazenado numa tabela hash.

Para tipos de valor, GetHashCode() fornece uma implementação padrão de código hash que utiliza reflexão. Deves considerar sobressprevê-lo para melhor desempenho.

Para mais informações e exemplos que calculam códigos de hash de várias formas, consulte a secção Exemplos.

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

  • Se dois objetos se compararem como iguais, o GetHashCode() método para cada objeto deve devolver o mesmo valor. No entanto, se dois objetos não se compararem como iguais, os GetHashCode() métodos para os dois objetos não têm de devolver valores diferentes.

  • O GetHashCode() método para um objeto deve devolver consistentemente o mesmo código hash desde que não haja modificação no estado do objeto que determine o valor de retorno do método System.Object.Equals do objeto. Note-se que isto é verdade apenas para a execução atual de uma aplicação, e que um código hash diferente pode ser devolvido se a aplicação for executada novamente.

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

  • As funções de hash devem ser baratas de calcular.

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

Por exemplo, a implementação do GetHashCode() método fornecido pela String classe devolve códigos hash idênticos para valores de cadeia idênticos. Portanto, dois String objetos retornam o mesmo código de hash se representarem o mesmo valor de cadeia. Além disso, o método utiliza todos os caracteres da cadeia para gerar uma saída distribuída de forma razoavelmente aleatória, mesmo quando a entrada está agrupada em certos intervalos (por exemplo, muitos utilizadores podem ter cadeias que contêm apenas os 128 caracteres ASCII inferiores, mesmo que uma cadeia possa conter qualquer um dos 65.535 caracteres Unicode).

Fornecer uma boa função de hash numa classe pode afetar significativamente o desempenho da adição desses objetos a uma tabela de hash. Numa tabela de hash com chaves que fornecem uma boa implementação de uma função de hash, a procura de um elemento demora tempo constante (por exemplo, uma operação O(1)). Numa tabela de hash com uma implementação pobre 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), onde n é o número de itens na tabela de hash). Um utilizador malicioso pode introduzir dados que aumentam o número de colisões, o que pode degradar significativamente o desempenho de aplicações dependentes de tabelas hash, sob as seguintes condições:

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

  • Quando uma grande proporção de objetos numa tabela de hash produz códigos de hash que são iguais ou aproximadamente iguais entre si.

  • Quando os utilizadores introduzem os dados a partir dos quais o código de hash é calculado.

As classes derivadas que sobrescrevem GetHashCode() também têm de sobrescrever Equals(Object) 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.

Aplica-se a

Ver também