룬(luhn) 알고리즘 구현
대단한건 아니지만 오늘 룬 알고리즘을 구현 할 일이 생겼다.
난 무식쟁이라 룬 알고리즘이란걸 오늘 알았다는건 안비밀...ㅎㅎ
무튼 신용카드 번호를 검증할때 사용하는 알고리즘이다.
위키를 보면 금방 이해할걸 여기저기 구글링하다보니 머리만 아파졌고,
결국 위키보고 이해했다.....
쉽게 말하자면
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가 상당히 신경쓰인다. 진짜 저렇게 밖에 사용하지 못하는건가... 싶은 마음이랄까....
무튼 룬 알고리즘에 대해 알아봤다.
생각보다 크게 어려운 알고리즘은 아니지만. 알아둔다면 지금같이 결제시스템을 만드는 때엔 크게 도움이 될 것 같다.
끝!!