2010-10-08 9 views

Respuesta

42

De acuerdo con reflector:

public override int GetHashCode() 
{ 
    return this; 
} 

Tiene sentido, ¿verdad?

+0

Supongo. Estaba pensando que todos los tipos de valores tendrían una implementación común. –

+0

No, cada tipo de valor tiene su propio. UInt32 se lanza a Int32, esto simplemente se convierte en un Signed Int. Int16 e Int64 hacen algunos cambios funky bit para generar un valor de 32 bits. System.Boolean devuelve 0 o 1 dependiendo de su estado. –

+3

Interesante, ¿por qué entonces 'int a = 10;' y 'int b = 10.GetHashCode();' proporciona diferentes instrucciones x86. Vemos que este método de una línea estará en línea, por lo que debería ser el mismo, pero no es –

-2

La mejor manera de hash 32 bit a 32 bit no es inventar la rueda, usar el valor en sí. Muy rápido, sin colisiones, de hecho una manera perfecta.

+3

Sí, pero eso no significa necesariamente que se implementó de esa manera. :) –

+9

En realidad, es una manera INCORRECTA de implementarlo. Por MS "Para obtener el mejor rendimiento, una función hash debe generar una distribución uniforme para todas las entradas, incluida la entrada que está muy agrupada. Una implicación es que pequeñas modificaciones en el estado del objeto deben producir grandes modificaciones al código hash resultante para la mejor tabla hash actuación." (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) Esta implementación, a pesar de ser simple, causa un mal agrupamiento y puede generar un rendimiento horrible cuando los datos se usan como claves de tabla de control. –

+10

@JeffWalkerCodeRanger Eso es generalmente cierto. Pero la mayoría de las tablas hash se implementan haciendo 'hashCode% bucketLength'. Por lo tanto, la secuencia común de '0, 1, 2, 3, ...' tendrá códigos hash perfectos. Sin embargo, si su entrada es '0, 32, 64, 96, 128, ...' cualquier matriz de tamaño de cubo de poder-de-dos <= 32 tendrá un 100% de colisiones hash. Si MS lo cambiara para hacer un poco de barajado, habrá otra secuencia que dará colisiones 100% hash. Mi punto es que no hay contexto para Int32, y sin contexto, no se puede hacer una buena función de hash. Si necesita hash data, escriba su propio hasher. – Aidiakapi