He estado buscando por todas partes, pero no puedo encontrar nada. ¿Alguien puede arrojar algo de luz sobre esto?¿Cómo se implementa GetHashCode() para Int32?
Respuesta
De acuerdo con reflector:
public override int GetHashCode()
{
return this;
}
Tiene sentido, ¿verdad?
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.
Sí, pero eso no significa necesariamente que se implementó de esa manera. :) –
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. –
@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
- 1. ¿Cómo se implementa GetHashCode para la estructura con dos cuerdas, cuando ambas cadenas son intercambiables
- 2. ¿cómo se implementa sarcmark?
- 3. ¿Cómo se implementa __RTC_CheckEsp?
- 4. ¿Cómo se implementa OpenID?
- 5. ¿Cómo se implementa set()?
- 6. ¿Cómo se implementa Set.toString()?
- 7. ¿Cómo se implementa HttpSession?
- 8. ¿Cómo se implementa BigDecimal?
- 9. ¿Cómo se implementa "const"?
- 10. ¿Cómo se implementa ** en Python?
- 11. cómo se implementa boost multi_index
- 12. ¿Por qué Int32.MaxValue * Int32.MaxValue == 1?
- 13. ¿Cómo se implementa std :: tuple?
- 14. aplicar GetHashCode() para objetos que contienen colecciones
- 15. ¿Cómo se implementa Google Calculator?
- 16. ¿Cómo se implementa malloc() internamente?
- 17. PhoneGap y cómo se implementa
- 18. GetHashCode Equality
- 19. Ejecución GetHashCode
- 20. GetHashCode() con^
- 21. ¿Cómo se implementa DeadlineExceededException en Google App Engine para Java?
- 22. NHibernate: Razones para anular Iguales y GetHashCode
- 23. ¿Cómo se implementa la autenticación en servicestack.net
- 24. ¿Cómo se implementa IO sin bloqueo?
- 25. ¿Cómo se implementa Malloc y Free?
- 26. ¿Cómo se implementa una clase en C?
- 27. ¿Cuándo hacemos GetHashCode() para un diccionario?
- 28. ¿Cómo se implementa realmente la grabadora Wami?
- 29. Cómo se implementa la esteganografía en php
- 30. ¿Cómo se implementa la paginación en PHP?
Supongo. Estaba pensando que todos los tipos de valores tendrían una implementación común. –
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. –
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 –