ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 룬(luhn) 알고리즘 구현
    Technique/Javascript 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가 상당히 신경쓰인다. 진짜 저렇게 밖에 사용하지 못하는건가... 싶은 마음이랄까....


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

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

    끝!!

    반응형

    'Technique > Javascript' 카테고리의 다른 글

    객체, Prototype  (0) 2016.11.20
    jQuery keyPress Event에 대하여  (0) 2016.09.09
    클로져 기초  (0) 2016.06.20
    [ jQuery ] select box actions  (0) 2016.04.06
    [ 펌 ] jQuery 성능 최적화  (0) 2016.01.27

    댓글

Designed by Tistory.