A parte il fatto che la tua funzione di hashing non è molto buona * , il problema più grande con il tuo codice non è che restituisce un numero diverso a seconda della versione di .NET, ma che in entrambi i casi restituisce un numero completamente privo di significato: la risposta corretta al problema è
49 103 mod 143 = è 114. ( collegamento in Wolfram Alpha )
Puoi usare questo codice per calcolare questa risposta:
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;
}
Il motivo per cui il tuo calcolo produce un risultato diverso è che per produrre una risposta, usi un valore intermedio che elimina la maggior parte delle cifre significative del numero 49103 : solo le prime 16 delle sue 175 cifre sono corrette!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Le restanti 159 cifre sono tutte sbagliate. L'operazione mod, tuttavia, cerca un risultato che richieda che ogni singola cifra sia corretta, comprese le ultime. Pertanto, anche il più piccolo miglioramento della precisione di Math.Pow
quello potrebbe essere stato implementato in .NET 4, comporterebbe una drastica differenza nel calcolo, che essenzialmente produce un risultato arbitrario.
* Poiché questa domanda parla dell'innalzamento di numeri interi a potenze elevate nel contesto dell'hashing delle password, potrebbe essere un'ottima idea leggere questo link di risposta prima di decidere se il tuo approccio attuale dovrebbe essere cambiato per uno potenzialmente migliore.