あなたのハッシュ関数があまり良くないという事実は別として*、あなたのコードの最大の問題は、それが.NETのバージョンに応じて、異なる数を返すということではなく、両方のケースでは、それは完全に無意味な数値を返すこと:問題に対する正しい答えは
49 103 MOD 143 =は114(あるウルフラムアルファへのリンク)
このコードを使用して、この答えを計算できます。
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;
}
計算結果が異なる理由は、回答を生成するために、49 103の数値の有効数字のほとんどを削除する中間値を使用するためです。175桁の最初の16のみが正しいです!
1230824813134842807283798520430636310264067713738977819859474030746648511411697029659004340261471771152928833391663821316264359104254030819694748088798262075483562075061997649
残りの159桁はすべて間違っています。ただし、mod操作では、最後の桁も含めて、すべての桁が正しいことを要求する結果が求められます。したがって、Math.Pow
.NET 4に実装されている可能性がある精度のほんのわずかな改善でも、計算に大幅な違いが生じ、本質的に任意の結果が生成されます。
*この質問は整数をパスワードのハッシュのコンテキストで累乗することについて話しているので、読むことは非常に良い考えかもしれません、現在のアプローチを潜在的に優れたものに変更する必要があるかどうかを判断する前に、この回答リンクです。