Outre le fait que votre fonction de hachage n'est pas très bonne * , le plus gros problème avec votre code n'est pas qu'elle renvoie un nombre différent en fonction de la version de .NET, mais que dans les deux cas elle renvoie un nombre totalement dénué de sens: la bonne réponse au problème est
49 103 Mod = 143 est 114. ( lien vers Wolfram Alpha )
Vous pouvez utiliser ce code pour calculer cette réponse:
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 raison pour laquelle votre calcul produit un résultat différent est que pour produire une réponse, vous utilisez une valeur intermédiaire qui supprime la plupart des chiffres significatifs du nombre 49103 : seuls les 16 premiers de ses 175 chiffres sont corrects!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Les 159 chiffres restants sont tous faux. L'opération de mod, cependant, recherche un résultat qui nécessite que chaque chiffre soit correct, y compris les tout derniers. Par conséquent, même la moindre amélioration de la précision Math.Pow
peut avoir été implémentée dans .NET 4 entraînerait une différence drastique de votre calcul, qui produit essentiellement un résultat arbitraire.
* Puisque cette question parle d'élever des nombres entiers à des puissances élevées dans le contexte du hachage de mot de passe, il peut être une très bonne idée de lire ce lien de réponse avant de décider si votre approche actuelle doit être modifiée pour une meilleure.