안녕하세요. 해시 코드 계산에 LINQ의 Enumerable.Sum()
확장 방법을 사용하고 있으며 코드가 커지면 OverflowExceptions
에 문제가 있습니다. unchecked
블록에 전화를 걸었지만 도움이되지 않았습니다.Enumerable.Sum() overflowing
방법에 대한 MSDN 문서는 값이 너무 커질 경우가 발생합니다 말한다,하지만 난 반사에 확인하고이 모든이있다 :이 컴파일을 바탕으로
는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;
}
, 나는 그것을 기대 오버플로 또는 호출 코드의 컨텍스트에 의존하지 않음. 왜 범람하고, 어떻게 멈출 수 있습니까?
이것은 오버플로에 관한 질문에 답하지 않고 있습니다.하지만 '합계'를 사용하여 객체의 해시 코드를 계산한다면 매우 잘 분산 된 해시 코드를 생성하지 못할 것입니다. 일반적인 접근법은 확인되지 않은 상황에서 프라임 곱셈 및 왼쪽 쉬프트와 같은 것입니다. –
그래, 이상적은 아니지만 합계 해시 코드 (하위 구성 요소의 해시 코드)가 훨씬 더 나은 방식으로 생성되므로 걱정하지 않아도됩니다. (나는 단지 'int'를 추가하는 것이 아니라, 작은 변화가 매우 다른 코드를 생성하지는 않는다.) 나는 이것이 내가 미쳐야 할 것이 아니라고 생각하지만, 아마 그것이 상상하는 것보다 더 중요 할 것이다 ...? –
해시 코드가 Int32.MaxValue 또는 그 근처에있는 경우 두 항목으로 오버플로 할 수 있습니다. int를 다루기 때문에 아이템을 많이 가질 때까지는 명확하지 않지만, 적절히 분산 된 해시 함수를 사용하면 예외를 던질 때가 많습니다. – thecoop