해싱 함수가별로 좋지 않다는 사실을 제외하고 * 코드의 가장 큰 문제는 .NET 버전에 따라 다른 숫자를 반환하는 것이 아니라 두 경우 모두 완전히 의미없는 숫자를 반환한다는 것입니다. 문제에 대한 정답은
49 103 = 114이 (143을 개조 볼프람 알파 링크 )
이 코드를 사용하여이 답변을 계산할 수 있습니다.
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에서 구현되었을 수 있는 정밀도에 대한 아주 작은 개선도 계산에 큰 차이를 가져와 본질적으로 임의의 결과를 생성합니다.
* 이 질문은 암호 해싱의 맥락에서 정수를 높은 힘으로 올리는 것에 대해 이야기하므로 현재 접근 방식을 잠재적으로 더 나은 접근 방식으로 변경해야하는지 결정하기 전에이 답변 링크 를 읽는 것이 좋습니다 .