# Luhn 알고리즘 이란?
- 신용카드번호, IMEI 번호, 주민번호 가 유효한 값인지 간단히 검사하는 알고리즘이다.
- 1960년대에 개발된 개방형 공식이다.
- 모듈러스10 혹은 mod10 알고리즘이라고 한다.
# Luhn 알고리즘 설명
1. 가장 오른쪽 숫자부터 시작해서 짝수번째에 해당하는 자릿수에 2를 곱한다.
* 만약 2를 곱한 수가 9 이상일 경우 각각의 자리수의 값을 더한다.
2. 가장 오른쪽 숫자부터 시작해서 홀수번째에 해당하는 숫자들은 그냥 그대로둔다.
3. 모든 값을 더한 뒤 10으로 나눈 나머지가 0 이면 유효한값이다.
# 예를 들어보자
* MasterCard Number: 5111-1111-1111-1118
step1. 가장 오른쪽 숫자부터 시작해서 짝수번째에 해당하는 자릿수에 2를 곱한다. ( 가장오른쪽부터 index가 시작한다.)
step2. 가장 오른쪽 숫자부터 시작해서 홀수번째에 해당하는 숫자들은 그냥 그대로둔다.
cardNo |
5 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
8 |
index |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
double |
10 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
8 |
sum |
1 (1+0) |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
8 |
step 3. 각각의 값들을 모두 더한다 .
표에서는 분홍색으로 칠해진 sum 에 있는 값들을 모두 더하게 된다. 값을 더한 결과는 30이다.
30을 10으로 나누면 30/10 = 0 이므로 유효한 카드번호값이다.
# 비고
Luhn 알고리즘(룬 공식)은 번호에 대해 각각 한자리 숫자를 이용하여 간단히 유효성 검증을 하는 알고리즘이다
좀 더 복잡한 유효성 체크를 원하면 Verhoeff algorithm and the Damm algorithm 를 사용하면된다.
## 카드번호 구성
* 카드번호를 예로 들은 만큼, 카드번호 구성에 대해 추가적으로 말하자면!!
한국내에서 사용할 수 있는 신용(체크)카드 번호는 다음과 같이 구성된다.
[ MII 번호 ]
MII 숫자값 |
발행자 분류 |
0 |
ISO/TC 68 및 기타 산업 |
1 |
항공 |
2 |
항공 및 기타 잠재적 산업 할당 |
3 |
여행 및 엔터테인먼트, 은행업/금융 |
4 |
은행업 및 금융 |
5 |
은행업 및 금융 |
6 |
상업 및 은행업/금융 |
7 |
석유 및 기타 잠재적 산업 할당 |
8 |
건강, 전기통신 및 기타 잠재적 산업 할당 |
9 |
국내 전용 |
* MII : 주 산업 식별번호
[ MII번호를 포함한 INN 번호 ]
카드사 | INN범위 |
자리수 |
American Express (신한,삼성,KB,하나카드등) |
34, 37 |
15 |
Diner's Club International (현대카드) |
300-305, 309,36, 38-39 |
14 |
VISA (롯데, 비씨, 삼성, 신한, 하나, 현대카드 등) |
4 |
16 |
Master Card |
51-55 |
16 |
Discover |
60110, 60112-60114, 601174-601179, 601186-601199, 644-649, 65 |
16 |
* INN : 카드의 발급자를 식별할 수 있는 6자로 된 번호이다.
첫쨰자리부터 여섯째 자리까지의 번호를 보면 해당 카드는 어느나라의 카드사가 발급한 카드인지, 카드 회원이 일반, 골드, 개인, 법인인지 알 수 있도록 되어있다.
2020/12/16 - [개발노트] - Code 128 Barcode의 Check Digit 계산방법
2020/12/15 - [iOS/Tips] - 디버깅 차단 처리 (Anti Debug)
2020/12/14 - [iOS/Tips] - bundle id 알아내기
2020/12/12 - [AI/Algorithm] - 2D 충돌처리
2020/12/11 - [iOS/Swift] - UIViewController 스위칭
2020/12/11 - [개발노트] - PlantUML 설치 (Mac OS X)
2020/12/10 - [iOS/Objective-C] - 웹뷰에서 javascript 함수 동기식 호출
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (2/2)
2020/12/10 - [iOS/Tips] - Fat Static Library 빌드 (1/2)
2020/12/10 - [iOS/Tips] - Custom UserAgent 설정
2020/12/10 - [iOS/Tips] - CocoaPods 설치 및 제거
2020/12/10 - [iOS/Tips] - Clang diagnostic 경고 무시하기
'개발 > Note' 카테고리의 다른 글
NVRAM(PRAM) 재설정 방법 (0) | 2020.07.11 |
---|---|
duplicate symbol 에러 해결 (0) | 2020.06.16 |
NFC Xcode 설정 (0) | 2020.05.29 |
NFC (Near Field Communication) (0) | 2020.05.29 |
NFC Tag 저장용량 (0) | 2020.05.29 |