Oye, estoy usando el método de extensión Enumerable.Sum()
de LINQ para calcular los códigos hash, y estoy teniendo un problema con OverflowExceptions
cuando el código se vuelve grande. Traté de poner la llamada en un bloque unchecked
, pero eso no pareció ayudar.Enumerable.Sum() desbordamiento
La documentación de MSDN para el método dice que va a lanzar si el valor se hace demasiado grande, pero me registré reflector y esto es todo lo que hay:
public static int Sum(this IEnumerable<int> source) {
if (source == null) {
throw Error.ArgumentNull("source");
}
int num = 0;
foreach (int num2 in source) {
num += num2;
}
return num;
}
En base a esta descompilación, yo esperaría que desbordamiento o no dependiendo del contexto del código de llamada. ¿Por qué se desborda y cómo puedo lograr que se detenga?
Esto no responde a la pregunta sobre el desbordamiento ... pero si usa 'Suma' para calcular el código hash de un objeto, probablemente no va a crear códigos hash muy bien distribuidos. El enfoque típico es algo así como multiplicar-por-prime-y-izquierda-cambiar-xor-siguiente en un contexto sin marcar. –
Sí, no es ideal, pero los códigos hash que estoy sumando (los códigos hash de los subcomponentes) se generan de una manera mucho mejor, así que no estoy tan preocupado por eso. (No estoy agregando 'int's, donde los pequeños cambios no producirían un código muy diferente.) Supongo que esto no es algo por lo que debería volverme loco, pero ¿tal vez es más importante de lo que imagino ...? –
Podría desbordar solo dos elementos, si los códigos hash están en o cerca de Int32.MaxValue. Dado que se trata de enteros, esto no se vuelve aparente hasta que tenga muchos elementos, pero con una función hash correctamente distribuida esto arrojará excepciones más de las veces – thecoop