Skip to content

Instantly share code, notes, and snippets.

@cdjhlee
Last active October 19, 2015 08:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cdjhlee/bf8274295f17e69da505 to your computer and use it in GitHub Desktop.
Save cdjhlee/bf8274295f17e69da505 to your computer and use it in GitHub Desktop.
문자열을 MD5로 지져서 나머지 연산하는 거
var crypto = require('crypto');
//문자열을 md5 해시하여 buffer로 리턴한다.
function getMd5Buffer(str) {
var md5sum = crypto.createHash('md5');
return md5sum.update(str).digest();
}
function getLargeMod(buffer, mod) {
var bufLen = buffer.length;
var modArray = [];
var i, r, result = 0;
for(i=0;i<bufLen;++i) {
//바이트 1개당 0~255(2^8)까지 가능하므로 256진법으로 계산한다.
r = ((buffer[i]%mod) * (expMod(256, (i-1), mod))) % mod;
modArray.push(r); //각 바이트별
}
for(i=0;i<bufLen;++i) {
result = ((result % mod) + (modArray[i] % mod)) % mod;
}
return result;
}
//지수함수 나머지 연산
function expMod(a, n, z) {
var result = 1;
var x = a % z;
while(n > 0) {
if(n % 2 == 1) {
result = (result * x) % z;
}
x = (x * x) % z;
n = ~~(n/2);
}
return result;
}
/**
* 문자열을 MD5 해싱 후 원하는 값으로 나머지 연산을 한다.
* @param str 원하는 문자열
* @param mod 나머지
* @return Number 예외 발생 시 -1 리턴
*/
exports.md5Mod = function(str, mod) {
try {
return getLargeMod(getMd5Buffer(str), mod);
} catch(e) {
console.error(e);
return -1;
}
};
@cdjhlee
Copy link
Author

cdjhlee commented May 8, 2015

256은 1바이트가 8비트라 그런거에여 2^8=256

@cdjhlee
Copy link
Author

cdjhlee commented May 8, 2015

적당히 응용하면 문자열을 MD5도 안하고 바로 나머지 하는 것도 가능합니다. ㅇㅅㅇ

@cdjhlee
Copy link
Author

cdjhlee commented Oct 19, 2015

Line 6. what the... I will fix it. thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment