Окрім того, що ваша хеш-функція не дуже хороша * , найбільшою проблемою вашого коду є не те, що він повертає інше число залежно від версії .NET, а те, що в обох випадках він повертає абсолютно безглузде число: правильна відповідь на задачу
49 103 мод 143 = - це 114. ( посилання на Wolfram Alpha )
Ви можете використовувати цей код для обчислення такої відповіді:
private static int PowMod(int a, int b, int mod) {
if (b == 0) {
return 1;
}
var tmp = PowMod(a, b/2, mod);
tmp *= tmp;
if (b%2 != 0) {
tmp *= a;
}
return tmp%mod;
}
Причиною того, чому ваше обчислення дає інший результат, є те, що для отримання відповіді ви використовуєте проміжне значення, яке скидає більшість значущих цифр числа 49 103 : правильні лише перші 16 із 175 цифр!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Решта 159 цифр помилкові. Операція мода, однак, шукає результат, який вимагає, щоб кожна окрема цифра була правильною, включаючи останню. Тому навіть найменше поліпшення точностіMath.Pow
яке, можливо, було впроваджено в .NET 4, призведе до різкої різниці у вашому обчисленні, що, по суті, дає довільний результат.
* Оскільки в цьому питанні йдеться про підвищення цілих чисел до великих рівнів у контексті хешування паролів, може бути дуже гарною ідеєю прочитати це посилання на відповідь, перш ніж вирішити, чи слід змінити ваш поточний підхід на потенційно кращий.