Abgesehen von der Tatsache, dass Ihre Hashing-Funktion nicht sehr gut ist * , besteht das größte Problem mit Ihrem Code nicht darin, dass er je nach .NET-Version eine andere Nummer zurückgibt, sondern in beiden Fällen eine völlig bedeutungslose Nummer: Die richtige Antwort auf das Problem lautet
49 103 mod 143 = ist 114. ( Link zu Wolfram Alpha )
Mit diesem Code können Sie diese Antwort berechnen:
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;
}
Der Grund, warum Ihre Berechnung ein anderes Ergebnis liefert, ist, dass Sie zur Erstellung einer Antwort einen Zwischenwert verwenden, der die meisten signifikanten Ziffern der Zahl 49 103 löscht: Nur die ersten 16 der 175 Ziffern sind korrekt!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
Die restlichen 159 Ziffern sind alle falsch. Die Mod-Operation sucht jedoch ein Ergebnis, bei dem jede einzelne Ziffer korrekt sein muss, einschließlich der allerletzten. Daher würde selbst die kleinste Verbesserung der Genauigkeit Math.Pow
, die möglicherweise in .NET 4 implementiert wurde, zu einem drastischen Unterschied Ihrer Berechnung führen, der im Wesentlichen zu einem beliebigen Ergebnis führt.
* Da es in dieser Frage darum geht, Ganzzahlen im Zusammenhang mit dem Passwort-Hashing auf hohe Potenzen zu bringen, ist es möglicherweise eine sehr gute Idee, sie zu lesen diesen Antwortlink , bevor Sie entscheiden, ob Ihr aktueller Ansatz durch einen potenziell besseren geändert werden soll.