체크 디지트

**체크 디지트** (check digit) 또는 **검사 숫자**는 은행 계좌 번호와 같은 식별 번호에 대한 오류 감지에 사용되는 중복 검사의 한 형태로, 수동으로 입력되는 청구서 등에서 때때로 사용된다. 컴퓨터로 생성된 데이터의 오류를 확인하는 데 사용되는 이진수 패리티 비트와 유사하다. 일련의 입력된 다른 숫자(또는 문자)를 이용하여 일정한 알고리즘에 의해 계산되는 하나 이상의 숫자(또는 문자)로 구성된다.

체크 디지트를 사용하면 하나의 잘못 입력된 숫자 또는 두 개의 연속된 숫자의 일부 순열과 같은 일련의 문자(일반적으로 숫자) 입력에서 간단한 오류를 감지할 수 있다.

## 설계
체크 디지트 알고리즘은 일반적으로 **사람**의 필기 오류를 포착하도록 설계되었다. 복잡성의 순서대로 기술하면 아래의 것이 포함되어 있다.

* l → 1 또는 O → 0과 같은 문자/숫자 오류
* 1 → 2와 같은 한 자리 오류
* 12 → 21과 같은 바꿔쓰기 오류
* 11 → 22와 같은 쌍 오류
* 점프 전치 오류(예: 132 → 231)
* 131 → 232와 같은 점프 트윈 오류
* 60 → 16("sixty" - "sixteen")과 같은 발음 오류

시스템을 선택할 때 오류를 포착할 가능성이 높은 것은 구현의 어려움과 서로 상쇄된다. 간단한 체크 디지트 시스템은 사람이 쉽게 이해하고 구현할 수 있지만 복잡한 프로그램만큼 많은 오류를 포착하지 못하게 된다.

바람직한 기능은 왼편에 0의 숫자가 여러개 있는 경우에 검사 숫자가 변경되지 않도록 하는 것이다. 이렇게 되면, 가변 길이 숫자를 사용하고 길이를 변경할 수 있다. 원래 번호에 하나의 검사 숫자가 추가되는 경우, 시스템에 의해서 두 개의 대체 오류(12 → 34)와 같은 **복수** 오류를 항상 캡처되지는 않지만 일반적으로 복수 오류는 90%의 시간 동안 발견된다(두 변경 사항 모두 금액을 변경하여 출력을 변경해야 한다).

매우 간단한 체크 디지트 방법은 모든 숫자의 합( 디지털 합 )을 10에 대한 나머지로 구하는 것이다. 이러한 오류에서는 항상 합계가 변경되므로 모든 한 자리 오류가 포착되지만, 재배열에 의해서는 합계가 변경되지 않으므로 전치 오류(두 자리 전환)는 포착되지 않는다.

약간 더 복잡한 방법은 각 숫자 위치에 대해 서로 다른 가중치를 사용하여 숫자의 가중 합에 대하여 10에 대한 나머지를 취하는 것이다.

이를 설명하기 위해 예를 들어 네 자리 숫자의 가중치가 5, 3, 2, 7이고 코딩할 숫자가 4871인 경우 5×4 + 3×8 + 2×7 + 7×1 = 65가 되고, 65를 10으로 나눈 나머지인 숫자 5가 되어 결국 48715가 된다.

가중치가 1, 3, 7, 또는 9로써 이웃한 숫자에 대하여 가중치를 달리하는 시스템이 널리 사용되고 있어서, 예를 들어 UPC 코드의 31 31 가중치, EAN 숫자의 13 13 가중치(GS1 알로리즘), 그리고  미국 은행 라우팅 전송 번호에서 사용되는 371371 가중치가 사용되고 있다. 이 시스템에 의하면, 모든 한 자릿수 오류와 전치 오류의 약 90%가 감지되는데, 1, 3, 7, 9는 10과 서로 소이므로 숫자를 변경하면 검사 숫자가 변경된다. 반면에 2 또는 5로 나눌 수 있는 계수를 사용하면 정보가 손실되어(왜냐하면 5×0 = 5×2 = 5×4 = 5×6 = 5×8 = 0 모듈로 10) 일부 한 자리 오류를 포착하지 못하게 된다. 이웃 숫자에 다른 가중치를 사용한다는 것은 대부분의 전위가 검사 숫자를 변경한다는 것을 의미한다. 그러나 모든 가중치가 짝수만큼 다르기 때문에 2와 5는 5만큼 다른 두 자리(0과 5, 1과 6, 2와 7, 3과 8, 4와 9)의 전위를 포착하지 못하는데, 이는 곱하면 10이 되기 때문이다.

대신에  코드에서는 소수인 모듈로 11을 사용하여 모든 숫자 위치는 서로 다른 가중치인 1, 2,&nbsp;...&nbsp;10을 갖는다. 따라서 이 시스템은 모든 한 자리 대체 및 전치 오류(점프 전치 포함)를 감지하지만 이는 "X"로 표시되는 10이 될 수 있는 검사 숫자를 희생하게 된다. (대안은 "X" 검사 숫자가 되는 일련 번호를 단순히 사용하지 않는 것이다. ) 달리 에서는 EAN 번호에 사용되는 GS1 알고리즘을 사용한다.

더 복잡한 알고리즘으로는 한 자리 전치 오류의 98%(90 ↔ 09는 감지하지 못함)를 포착하는 룬 알고리즘 (1954)과 한 자리 대체 및 전치 오류와, 전부는 아니지만 다수의 더 복잡한 오류를 포착할 수 있는 훨씬 더 정교한 베어호프(Verhoeff) 알고리즘 (1969)이 있다. 유사한 또 다른 추상 대수학 기반 방법인 댐(Damm) 알고리즘 (2004)에서도 모든 한 자리 오류와 모든 인접한 전치 오류를 감지한다. 이 세 가지 방법은 단일 검사 숫자를 사용하므로 더 복잡한 오류의 약 10%를 캡처하지 못한다. 이 실패율을 줄이려면 하나 이상의 검사 숫자(예: 두 개의 검사 숫자를 사용하는 아래에 언급된 모듈로 97 수표, 알고리즘의 경우 국제 은행 계좌 번호 참조)를 사용하거나 체크 디지트로 예를 들어 문자와 숫자와 같이 더 넓은 범위의 문자를 사용하여야 한다.
## 예

### UPC
범용 제품 코드(UPC)의 마지막 숫자는 다음과 같이 계산되는 검사 숫자이다.

# 오른쪽부터 홀수 자리(첫 번째, 세 번째, 다섯 번째 등 - 검사 숫자 제외)의 숫자를 더하고 3을 곱한다.
# 결과에 짝수 위치(두 번째, 네 번째, 여섯 번째 등)의 숫자(검사 숫자까지 제외)를 더한다.
# 나머지 결과를 10으로 나눈 나머지 값을 취한다(즉, 모듈로 10 연산). 나머지가 0이면 0을 검사 숫자로 사용하고, 0이 아니면 10에서 그 나머지를 빼서 검사 숫자를 도출한다.

예를 들어 티슈 상자의 UPC-A 바코드는 "036000241457"이다. 마지막 숫자는 검사 숫자 "7"이며 다른 숫자가 정확하면 검사 숫자 계산에서 7이 생성되어야 한다.

# 홀수 자릿수를 더한다: 0+6+0+2+1+5 = 14.
# 결과에 3을 곱한다: 14 × 3 = 42.
# 짝수 자릿수를 더한다: 3+0+0+4+4 = 11.
# 두 결과를 함께 더한다: 14 + 42 = 57.
# 체크 디지트를 계산하려면 (57 모듈로 10)이라고도 하는 (57 / 10)의 나머지를 취하고 0이 아니면 10에서 뺀다. 따라서 체크 디지트 값은 7이다. 즉 (57 / 10) = 5 나머지 7; 10 - 7 = 3.

또 다른 예: 다음 식품 항목 "01010101010 ***x*** "에 대한 검사 숫자를 계산한다.

# 홀수 자릿수를 더한다: 0+0+0+0+0+0 = 0.
# 결과에 3을 곱한다: 0 x 3 = 0.
# 짝수 자릿수를 더한다: 1+1+1+1+1=5.
# 두 결과를 함께 더한다: 0 + 5 = 5.
# 체크 디지트를 계산하려면 (5 모듈로 10)이라고도 하는 (5 / 10)의 나머지를 취하고 0이 아니면 10에서 뺀다. 즉, (5 / 10) = 0 나머지 5; (10 - 5) = 5. 따라서 검사 숫자 ***x*** 값은 5이다.

### 10
10자리 국제표준도서번호에서 마지막 문자는, 각 숫자에 숫자의 해당 위치에 해당하는 수(오른쪽부터 계산)를 곱하고 이들 곱의 합산의 모듈로 11을 합하면 0이 되도록 계산된 검사 숫자이다. 가장 오른쪽에 있는 숫자(1을 곱한 값)는 합계를 올바르게 만들기 위해 선택한 검사 숫자이다. 이때 필요한 숫자는 10이 될 수 있는데 이때는 문자 X로 표시된다. 예를 들어  들면, 곱의 합은 0×10 + 2×9 + 0×8 + 1×7 + 5×6 + 3×5 + 0×4 + 8×3 + 2×2 + 1 ×1 = 99 ≡ 0(모드 11). 따라서 ISBN이 유효하다. 위치는 왼쪽부터 계산할 수도 있는데, 이 경우에는 유효성을 확인하기 위해 검사 숫자에 10을 곱한다: 0×1 + 2×2 + 0×3 + 1×4 + 5×5 + 3×6 + 0 ×7 + 8×8 + 2×9 + 1×10 = 143 ≡ 0(mod 11).

### 13
 13(2007년 1월 사용)은 책 바코드 아래에 있는 EAN-13 코드와 같다. 체크 디지트는 홀수 대신 짝수에 3을 곱한다는 점을 제외하면 UPC와 동일한 방식으로 생성된다.

### EAN(GS1에서 관리하는 GLN, GTIN, EAN 번호)
EAN( European Article Number, 국제상품번호 ) 체크 디지트( GS1 에서 관리)는 각 짝수 위치 번호에 3을 곱한 다음 홀수 위치 번호의 합계를 더하여 계산된다. 숫자는 오른쪽에서 왼쪽으로 검사되므로 첫 번째 홀수 위치는 코드의 마지막 숫자이다. 검사 숫자를 계산하기 위해 결과의 마지막 숫자를 10에서 뺀다(또는 이미 0인 경우 그대로 둔다). GS1 체크 디지트 계산기 및 자세한 문서는 GS1 웹사이트에서 온라인으로 제공한다. 또 다른 공식 계산기 페이지는 GTIN-13의 메커니즘이 글로벌 위치 번호 /GLN과 동일함을 보여준다.

### NCDA
2004년부터 사용 중인 NOID Check Digit Algorithm(NCDA) 은 영구 식별자에 적용하도록 설계되었으며 확장 숫자라고 하는 문자 및 숫자의 가변 길이 문자열과 함께 작동한다. ARK 식별자 체계와 함께 널리 사용되며 핸들 시스템 및 DOI 와 같은 체계와 함께 다소 사용된다. 확장된 숫자는 모음과 문자 'l'(ell)을 뺀 영숫자인  문자로 제한된다. 이 제한은 실수로 단어를 형성할 가능성이 없고 O와 0 또는 l과 1을 모두 포함하지 않는 불투명 문자열을 생성할 때 도움이 된다. R=29의 소수 기수를 갖는 베타숫자 레퍼토리는 알고리즘이 길이가 R=29자 미만인 문자열에 대해 단일 문자 및 전치 오류의 감지를 보장하도록 허용한다(그 이상은 약간 더 약한 검사를 제공한다). 알고리즘은 소수 기수 R 및 길이가 R자 미만인 문자열이 있는 모든 문자 레퍼토리로 일반화된다.

### 체크 디지트의 다른 예

#### 국제

* 국제 SEDOL 번호.
* ISSN 코드 또는 IMO 번호 의 마지막 숫자.
* ISIN( 국제 증권 식별 번호 ).
* 개체 관리 그룹 FIGI 표준 최종 숫자.
* 국제 CAS 등록 번호의 마지막 숫자.
* Luhn 알고리즘에 의해 계산된 신용 카드 계좌 번호의 Modulo 10 검사 숫자.
** 은행 지로(신용이체)에서 사용되는 노르웨이 KID(고객 식별 번호) 번호에도 사용되며,
** 휴대폰의 IMEI 에 사용됨.
* GTIN (Global Trade Identification Number)의 EAN/UPC 직렬화에서 마지막 검사 숫자입. GTIN-8, GTIN-12, GTIN-13 및 GTIN-14에 적용됨.
* DUNS 번호의 마지막 숫자(최종 숫자가 검사 숫자가 아닌 새 할당에서 자유롭게 선택되는 것과 같이 변경될 예정임).
* 국제 은행 계좌 번호 (Modulo 97 수표)의 세 번째 및 네 번째 숫자.
* 국제 표준 텍스트 코드의 마지막 숫자.
* 마그네틱 스트라이프 카드에 인코딩된 최종 문자는 계산된 세로 중복 검사이다.

#### 미국

* 미국 의료 산업에 대한 National Provider Identifier 의 10번째 숫자.
* POSTNET 코드의 마지막 숫자.
* 북미 CUSIP 번호.
* 미국에서 사용되는 은행 코드 인 ABA 라우팅 전송 번호 의 마지막(9번째) 숫자.
* 차량 식별 번호 (VIN)의 9번째 숫자.
* 애리조나와 플로리다에서 사용되는 Mayo Clinic 환자 식별 번호에는 후행 검사 숫자가 포함된다.  .
* Customs & Border Protection 항목 번호의 11번째 숫자이다.

#### 중앙 아메리카

* 모듈 로 11을 기반으로 하는 과테말라 세금 번호(NIT – Número de Identificación Tributaria).

#### 유라시아

* 영국 NHS 번호는 모듈로 11 알고리즘을 사용한다.
* 스페인 회계 식별 번호(número de identificación fiscal, NIF)(modulo 23 기준).
* Dutch Burgerservicenummer (BSN)(국가 식별자)는 모듈로 11 알고리즘을 사용한다.
* 이스라엘 Teudat Zehut (신분증) 번호의 9번째 숫자.
* 세르비아 및 구 유고슬라비아 고유 마스터 시민 번호 (JMBG)의 13번째 숫자. (오류 또는 비거주로 인해 전부는 아님)
* 11자리 터키 식별 번호의 마지막 두 자리().
* 14자리 EU 가축 여권 번호의 9번째 문자(1에서 7까지 순환: British Cattle Movement Service 참조).
* 아이슬란드 어 Kennitala (국가 ID 번호)의 9번째 숫자.
* 벨기에 및 세르비아 은행 계좌 번호의 Modulo 97 검사 숫자. 세르비아는 참조 번호로 모듈로 11을 사용하기도 한다.
* 헝가리 TAJ 번호(사회 보험 번호)의 9번째 숫자.
* 인도 거주자의 경우 Aadhaar 라는 고유 식별 번호에는 Verhoeff 알고리즘 으로 계산되는 후행 12번째 숫자가 있다.
* 싱가포르 지적 재산청 (IPOS)은 등록 가능한 지적 재산 (IP, 예: 상표, 특허, 등록 디자인 )의 출원 번호에 대한 새로운 형식을 확인했다. Damm 알고리즘 으로 계산된 확인 문자가 포함된다.
* 중국 시민 ID 번호(2세대)의 마지막 숫자는 ISO 7064:1983을 채택한 중국 GuoBiao(일명 국가 표준) GB11643-1999에 지정된 모듈로 11-2로 계산된다. 계산된 검사 숫자가 10인 경우 'X'가 사용된다.
* 에스토니아 Isikukood (개인 식별 코드)의 11번째 숫자.
* 싱가포르 차량 등록 번호판 의 마지막 글자.

#### 오세아니아

* 호주 세금 파일 번호 ( modulo 11 기반).
* 뉴질랜드 NHI 번호 의 일곱 번째 문자.
* 뉴질랜드 기관차 의 교통 모니터링 시스템(TMS) 번호의 마지막 숫자.

## 알고리즘
주요한 알고리즘은 다음과 같다.

* 룬 알고리즘 (1954)
* 베어호프 알고리즘 (1969)
* 담 알고리즘 (2004)

## 같이 보기
* 체크섬
* 캐스팅 아웃 나인즈 – 유사한 모듈라 섬 체크
* 체크 비트 – 이진 등가물

## 각주

## 외부 링크
* 식별 번호 및 체크 디지트 체계(다양한 체크 디지트 체계에 대한 수학적 설명)
* UPC, EAN 및 SCC-14 검사 숫자 계산기
* GS1 체크 디지트 계산기

분류:오류 검출 정정