Pomijając fakt, że twoja funkcja haszująca nie jest zbyt dobra * , największym problemem z twoim kodem nie jest to, że zwraca inną liczbę w zależności od wersji .NET, ale w obu przypadkach zwraca całkowicie bezsensowną liczbę: prawidłowa odpowiedź na problem brzmi
49 103 mod 143 = jest 114. ( link do Wolfram Alpha )
Możesz użyć tego kodu do obliczenia tej odpowiedzi:
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;
}
Powodem, dla którego obliczenia dają inny wynik, jest to, że w celu uzyskania odpowiedzi używasz wartości pośredniej, która usuwa większość znaczących cyfr liczby 49 103 : tylko pierwsze 16 z 175 cyfr jest poprawnych!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Pozostałe 159 cyfr jest błędnych. Jednak operacja mod szuka wyniku, który wymaga, aby każda cyfra była poprawna, w tym ostatnia. Dlatego nawet najmniejsza poprawa precyzji Math.Pow
mogłaby zostać zaimplementowana w .NET 4, spowodowałaby drastyczną różnicę w obliczeniach, co w zasadzie daje arbitralny wynik.
* Ponieważ to pytanie dotyczy podniesienia liczb całkowitych do wysokich potęg w kontekście haszowania haseł, może być bardzo dobrym pomysłem przeczytanie tego linku odpowiedzi przed podjęciem decyzji, czy obecne podejście powinno zostać zmienione na potencjalnie lepsze.