除了您的哈希函数不是一个很好的*之外,您的代码的最大问题还不是它根据.NET的版本返回了不同的数字,而是在两种情况下均返回了一个完全无意义的数字:问题的正确答案是
49 103 mod 143 =是114。(链接至Wolfram Alpha)
您可以使用以下代码来计算此答案:
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中可能已经实现了对精度的最小改进,也将导致计算的巨大差异,这实际上会产生任意结果。
*由于此问题是关于在密码哈希中将整数提高到高幂,因此在决定是否应将当前方法更改为可能更好的方法之前,阅读此答案链接可能是一个很好的主意。