Aparte del hecho de que su función hash no es muy buena * , el mayor problema con su código no es que devuelve un número diferente dependiendo de la versión de .NET, sino que en ambos casos devuelve un número completamente sin sentido: la respuesta correcta al problema es
49 103 mod 143 = es 114. ( enlace a Wolfram Alpha )
Puede usar este código para calcular esta respuesta:
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;
}
La razón por la que su cálculo produce un resultado diferente es que para producir una respuesta, usa un valor intermedio que elimina la mayoría de los dígitos significativos del número 49103 : ¡solo los primeros 16 de sus 175 dígitos son correctos!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Los 159 dígitos restantes están mal. Sin embargo, la operación de modificación busca un resultado que requiera que todos los dígitos sean correctos, incluidos los últimos. Por lo tanto, incluso la más mínima mejora en la precisión de Math.Pow
eso puede haberse implementado en .NET 4, daría como resultado una diferencia drástica de su cálculo, que esencialmente produce un resultado arbitrario.
* Dado que esta pregunta habla de aumentar los números enteros a poderes altos en el contexto del hash de contraseñas, puede ser una muy buena idea leer este enlace de respuesta antes de decidir si su enfoque actual debe cambiarse por uno potencialmente mejor.