Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 숫자를 문자열로 변환하는 방법 – encode/decode 함수 구현

로그인 시스템에서 사용자를 고유하게 식별하기 위해 각 사용자에게 고유한 userID가 필요하다고 가정해 보겠습니다. 보안상의 이유로 이 userID를 난독화(obfuscate)하여 다른 사람이 해당 숫자를 쉽게 추측하지 못하도록 만들고 싶습니다.

이를 위해 기본적으로 두 가지 함수를 작성해야 합니다.

  • encode()

  • decode()

첫 번째 함수는 숫자 입력을 26진수 알파벳 매핑으로 변환하고, 두 번째 함수는 그 알파벳 매핑을 다시 원래의 숫자로 되돌리는 역할을 합니다.

물론 대부분의 해싱(Hashing) 알고리즘은 양방향 변환을 지원하지 않기 때문에 실무에서는 크게 활용되지 않지만, 이번 문제에서는 그 부분은 고려하지 않겠습니다.

예를 들어 숫자가 31이라면 다음과 같이 동작합니다.

encode(31) = 'ea'
decode('ea') = 31

예제 코드

이를 구현한 코드는 다음과 같습니다.

const num = 31;
const encode = num => {
    let res = '';
    const legend = 'zabcdefghijklmnopqrstuvwxy';
    while(num){
        const rem = num % (legend.length);
        res += legend[rem];
        num = (Math.floor(num / legend.length));
    };
    return res;
};
const decode = str => {
    let num = 0;
    const legend = 'zabcdefghijklmnopqrstuvwxy';
    for(let i = 0; i < str.length; i++){
        const ind = legend.indexOf(str[i]);
        num += (ind * Math.pow(legend.length, i));
    };
    return num;
}
console.log(encode(num));
console.log(decode('ea'));

동작 원리

encode 함수는 주어진 숫자를 26으로 계속 나누면서 나머지에 해당하는 문자를 하나씩 붙이는 방식으로 동작합니다. 여기서 사용된 legend 문자열 'zabcdefghijklmnopqrstuvwxy'의 특징은 인덱스 0에 'z'를 배치했다는 점입니다. 덕분에 나눗셈의 나머지가 0일 때도 유효한 문자가 매핑되어 변환 과정이 자연스럽게 처리됩니다.

반대로 decode 함수는 문자열의 각 문자를 legend에서 찾아 인덱스 값을 구한 뒤, 26의 거듭제곱을 곱해 모두 더함으로써 원래의 숫자를 정확히 복원합니다.

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

ea
31