Outre le fait que votre fonction de hachage n'est pas très bonne. * Si l'on prend en compte la version de .NET, le plus gros problème de votre code n'est pas qu'il renvoie un nombre différent selon la version de .NET, mais que dans les deux cas, il renvoie un nombre totalement dénué de sens : la réponse correcte 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 laisse tomber la plupart des chiffres significatifs de la valeur de 49 103 nombre : seuls les 16 premiers de ses 175 chiffres sont corrects !
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Les 159 chiffres restants sont tous faux. L'opération mod, cependant, cherche un résultat qui exige que chaque chiffre soit correct, y compris les tout derniers. Par conséquent, même la plus petite amélioration de la précision de Math.Pow
qui a pu être mis en œuvre dans .NET 4, entraînerait une différence radicale de votre calcul, qui produit essentiellement un résultat arbitraire.
* Puisque cette question traite de l'élévation des nombres entiers à des puissances élevées dans le contexte du hachage de mots de passe, il peut s'avérer une très bonne idée de lire cette réponse lien avant de décider si votre approche actuelle doit être modifiée pour une approche potentiellement meilleure.