Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original
1 de 1 pessoas classificaram isso como útil - Avalie este tópico

Método Object.GetHashCode

Serve como uma função hash para um tipo específico.

Namespace:  System
Assembly:  mscorlib (em mscorlib.dll)
public virtual int GetHashCode()

Valor de retorno

Tipo: System.Int32
Um código hash para a atual Object.

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 implementadores

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 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.

Em alguns casos, o GetHashCode método é implementado para simplesmente retornar um valor inteiro. O exemplo de código a seguir ilustra uma implementação de GetHashCode , que retorna um valor inteiro.

Existem outras maneiras mais complicadas para combinar os códigos de hash podem fornecer o melhor desempenho para tabelas hash.


using System;

public struct Int32 {
   public int value;

   //other methods...

   public override int GetHashCode() {
      return value;
   }
}


Freqüentemente, um tipo tem vários campos de dados que podem participar gerando o código de hash. Uma maneira de gerar um código de hash é combinar esses campos usando um XOR (eXclusive OR) operação, como mostrado no seguinte exemplo de código.


using System;

public struct Point {
   public int x;
   public int y; 

   //other methods

   public override int GetHashCode() {
      return x ^ y;
   }
}


O exemplo de código a seguir ilustra o outro caso em que os campos do tipo são combinados usando XOR (eXclusive OR) para gerar o código de hash. Observe que, neste exemplo de código, os campos user-defined representam tipos, cada um dos quais implementa GetHashCode e Equals.


using System;

public class SomeType {
   public override int GetHashCode() {
     return 0;
   }
}

public class AnotherType {
   public override int GetHashCode() {
     return 1;
   }
}

public class LastType {
   public override int GetHashCode() {
     return 2;
   }
}

public class MyClass {
   SomeType a = new SomeType();
   AnotherType b = new AnotherType();
   LastType c = new LastType();

   public override int GetHashCode () {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}


Se o membro de dados da classe derivada é maior do que uma Int32, você pode combinar os bits de ordem alta do valor com os bits de ordem baixa usando um XOR (eXclusive OR) operação, como mostrado no seguinte exemplo de código.


using System;

public struct Int64 {
   public long value;

   //other methods...

   public override int GetHashCode() {
      return ((int)value ^ (int)(value >> 32));
   }
}


.NET Framework

Com suporte em: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Com suporte em: 4, 3.5 SP1

Windows 7, Windows Vista SP1 ou posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core não compatível), Windows Server 2008 R2 (Server Core não compatível com SP1 ou posterior), Windows Server 2003 SP2

O .NET Framework não oferece suporte a todas as versões de cada plataforma. Para obter uma lista das versões com suporte, consulte Requisitos de sistema do .NET Framework.
Isso foi útil para você?
(1500 caracteres restantes)

Contribuições da comunidade

ADICIONAR
© 2013 Microsoft. Todos os direitos reservados.