嗨,我使用LINQ的Enumerable.Sum()
擴展方法來計算哈希代碼,並且在代碼變大時遇到OverflowExceptions
問題。我試圖將電話撥入unchecked
區塊,但這似乎沒有幫助。Enumerable.Sum()溢出
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;
}
在此基礎上編譯,我就指望它根據調用代碼的上下文而定溢出或不溢出。它爲什麼會溢出,我怎麼才能讓它停止?
這不是回答有關溢出的問題......但如果你使用Sum來計算一個對象的哈希碼,你可能不會創建分佈很好的哈希碼。典型的方法是在未經檢查的環境中進行乘法運算和左乘法運算。 – 2010-02-05 17:01:17
是的,這並不理想,但是我總結的哈希碼(子組件的哈希碼)是以更好的方式生成的,所以我並不擔心它。 (我不只是加上'int's,小的變化不會產生一個非常不同的代碼。)我認爲這不是我應該瘋了,但也許它比我想象的更重要...? – 2010-02-05 17:32:08
如果哈希碼在Int32.MaxValue處或其附近,您可能只會溢出兩個項目。由於你正在處理整數,所以在你有很多項目之前這個問題並不明顯,但是如果散列函數分佈正確,這將會拋出異常,這往往會導致異常 – thecoop 2010-02-05 17:55:28