Technique/Javascript

룬(luhn) 알고리즘 구현

kaelina 2016. 2. 17. 19:25
반응형

대단한건 아니지만 오늘 룬 알고리즘을 구현 할 일이 생겼다.

난 무식쟁이라 룬 알고리즘이란걸 오늘 알았다는건 안비밀...ㅎㅎ

무튼 신용카드 번호를 검증할때 사용하는 알고리즘이다.


위키를 보면 금방 이해할걸 여기저기 구글링하다보니 머리만 아파졌고,

결국 위키보고 이해했다.....


쉽게 말하자면

1. 신용카드 번호를 뒤에서 부터 세어( 즉 오른쪽에서 부터 세라는 말이다. ) 더하면서 진행

2. 2의 배수의 자리에 있는 수는 x2 를 한다.

3. 2번 과정에서 x2 한 숫자가 10보다 크다면 10의 자리수와 1의자리 수를 더한수를 더한다.

4. 위 과정이 끝낫다면 전체 숫자가 10의 배수라면 true 아니면 false


그림을 보자


위 카드번호는 테스트용 카드번호로 검색하면 나오는 비자카드 번호이다.

오른쪽 부터 읽어 나갓을때 붉은 색 부분이 x2 해야하는 부분이다

이런식으로 더해가면 결과는 90이 나오고

90은 10의 배수이기에 위 번호는 참이 된다.


세계적으로 유명한 5개 카드회사 ( visa, master, jcb, amex, diners )는 룬 알고리즘을 이용하여 카드번호를 생성하기에 검증 가능한 방법이다.

선두 문자로 체크하는 것도 좋지만 룬알고리즘을 이용해 재차 확인하는 것도 안전하다고 생각한다.

허접하지만 javascript로 짜봣다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// luhn algorithmで2次チェック
// カード番号の長さ
var tmpCardNoLen = cardNo.length;
// カード番号をリスト化
var tmpCardNo = cardNo.split("");
// カウンタ
var tmpCount = 1;
// 合計
var tmpTotal = 0;
// 計算
for (var i = tmpCardNoLen; i > 0; i--) {
    // カード番号の右から左へ移動しながら、2番めの順番でかける2それ以外は普通にプラス
 
    // 2の倍数の場合X2
    if (tmpCount % 2 == 0) {
        var tmpDouble = tmpCardNo[i - 1* 2;
        // かけた結果が10以上なら、二桁と一桁をたす
        if (tmpDouble > 10) {
            var tmp = tmpDouble.toString().split("");
            tmpTotal = parseInt(tmpTotal) + parseInt(tmp[0]) + parseInt(tmp[1]);
        } else {
            // 普通は全体に足す
            tmpTotal += parseInt(tmpDouble);
        }
    } else {
        // それ以外は普通に足す
        tmpTotal += parseInt(tmpCardNo[i - 1]);
    }
    tmpCount++;
// for終了
 
if (tmpTotal % 10 != 0) {
    return false;
}
 
return true;
cs

주석이 일본어 인건 신경쓰지 말자....ㅋㅋ

위에서 설명한 방법을 그대로 javascript로 옮겼다.

javascript는 잘 다루지 못하는 언어이지만..... 그렇기에 저기 저 parseInt가 상당히 신경쓰인다. 진짜 저렇게 밖에 사용하지 못하는건가... 싶은 마음이랄까....


무튼 룬 알고리즘에 대해 알아봤다.

생각보다 크게 어려운 알고리즘은 아니지만. 알아둔다면 지금같이 결제시스템을 만드는 때엔 크게 도움이 될 것 같다.

끝!!

반응형