Помимо того, что ваша функция хеширования не очень хороша * , самая большая проблема с вашим кодом заключается не в том, что он возвращает другое число в зависимости от версии .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;
}
Причина, по которой ваши вычисления дают другой результат, заключается в том, что для получения ответа вы используете промежуточное значение, которое отбрасывает большинство значащих цифр числа 49103 : только первые 16 из его 175 цифр верны!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Остальные 159 цифр неверны. Однако операция mod ищет результат, требующий, чтобы каждая цифра была правильной, включая самые последние. Следовательно, даже малейшее улучшение точности, Math.Pow
которое могло быть реализовано в .NET 4, привело бы к резкому изменению ваших вычислений, что по существу дает произвольный результат.
* Поскольку в этом вопросе говорится о повышении целых чисел до высоких степеней в контексте хеширования паролей, может быть очень хорошей идеей прочитать эту ссылку для ответа, прежде чем решить, следует ли изменить ваш текущий подход на потенциально лучший.