2012-05-22 19 views
5

¿Tiene algún significado especial cuando la función GetHashCode() devuelve algo usando el código que contains^symbol?GetHashCode() con^

public class ClassProp 
{ 
    public int Prop1 { get; set; } 
    public int Prop2 { get; set; } 
    public int Prop3 { get; set; } 
    public int Prop4 { get; set; } 
    public int Prop5 { get; set; } 

    public override int GetHashCode() 
    { 
     return Prop1.GetHashCode()^Prop2.GetHashCode()^
       Prop3.GetHashCode()^Prop4.GetHashCode()^Prop5.GetHashCode(); 
    } 
} 
+0

Muchas respuestas señalaron que no es el operador XOR. Se usa aquí solo para crear un hashcode combinado. Eche un vistazo a esta publicación aquí en SO: http://stackoverflow.com/questions/1079192/is-it-possible-to-combine-hash-codes-for-private-members-to-generate-a-new- hash –

Respuesta

4

Eso es solo bitwise xor operator. A menudo se usa para combinar códigos hash de diferentes objetos en un único código hash general.

¡No es una de las cosas más fáciles de buscar en Google! Mi consejo al buscar tales cosas es mirar el table of all operators.

+0

¿puedes compartir un ejemplo real simple para entender cuándo usar la función GetHashCode() en un proyecto real? – Nilish

+0

Generalmente, usted no llama mucho al 'GetHashCode'. Pero el marco lo usa para pruebas de igualdad, hashing de diccionario, etc. En general, puede salirse con la suya confiando en la implementación predeterminada. –

+0

¿Está hablando de esta 'anulación pública bool Equals (Object obj) {}'? Si es así, ¿cuál es la relación entre estos dos? – Nilish

4

^ es el C# XOR operator. No hay nada "especial" al respecto, solo que los códigos hash de todas las propiedades de clase están unidos por XOR.

Editar: GetHashCode devuelve un código genérico que se utiliza como identificador abreviado para un objeto complejo. Un uso común es utilizar estructuras de datos hash cuando desee almacenar objetos y luego recuperarlos rápidamente en función de su código hash. Suponga una clase Person y algunos objetos con los correspondientes códigos hash:

Alex 8540 
John 9435 
Peter 2453 

Estos códigos se genera en base a algunos o todos los campos de cada objeto y deben chocar lo menos posible para asegurar hash eficiente. Ahora podemos almacenar los objetos en una tabla hash utilizando el código hash:

Entries 
0 -> Alex 
1 -> John 
2 -> Peter 

Los objetos se almacenan en la tabla con sus respectivos códigos hash para determinar la posición. A continuación, pueden recuperarse fácilmente utilizando el mismo código hash.

Te sugiero que encuentres algo de literatura sobre cómo funcionan las tablas hash, porque es demasiado explicar en una publicación SO.

+0

¿puedes compartir un ejemplo real simple para entender cuándo usar la función GetHashCode() en un proyecto real? – Nilish

+0

@Kanav: Ver mi edición. – Tudor

+0

¿Tiene un artículo muy básico (un enlace) en su diccionario? – Nilish

0

El operador XOR bit a bit funciona como sigue:

A = 10.111 B = 01,010

A^B = 11,101

Diferentes bits de correspoding resutl en 1, otros similares resultan en 0.

En su caso, esos enteros primero se convierten en binarios y luego se procesan como en el ejemplo anterior.

2

Esa es la bitwize XOR operator.

Este es un operador muy común utilizado al implementar GetHashCode.

Dicho esto, en este caso, esa implementación puede no ser ideal. El problema con el uso de XOR (solo) es que no necesariamente se reducen las posibilidades de colisiones.La cuestión es que una clase definida de esta manera:

class Foo 
{ 
    public int Bar { get; set; } 
    public int Baz { get; set; } 

    // ... 
    public override int GetHashCode() 
    { return this.Bar.GetHashCode()^this.Baz.GetHashCode(); } 
} 

va a crear el mismo código hash cuando la barra == == 2 y 4 Baz como cuando bar == == 4 y Baz 2. Dependiendo del caso de uso, esto puede conducir a más colisiones hash, por lo que es algo a tener en cuenta al implementar GetHashCode. Además, debe tener mucho cuidado al hacer un tipo mutable como este, que su implementación de código hash coincida con sus verificaciones de igualdad, etc.

+1

¿puedes compartir un ejemplo real simple para entender cuándo usar la función GetHashCode() en un proyecto real? – Nilish

Cuestiones relacionadas