체크 숫자

데이터 뒤에 붙어서 해당 데이터가 잘못 입력되거나 잘못 전송되거나 해서 생기는 오류를 잡아 내는 용도로 사용하는 숫자. 보통 체크 숫자라고 할 때는 대부분 식별자에 포함되는 간단한 한 두 자리 정도의 숫자를 나타내는 케이스가 흔하며, 좀 더 일반적인 케이스는 오류검출부호오류정정부호를 보라.

알고리즘

많은 수의 체크 숫자는 체크 숫자를 포함한 데이터의 각 자리에 고정된 가중치를 곱하여 모두 더한 뒤, 그 합이 특정한 나눔수(보통 10 또는 11)로 나눠서 떨어지도록 체크 숫자를 정하는 방법을 사용한다. (계산을 편리하게 하기 위해 체크 숫자에 대응되는 가중치는 1인 경우가 보통이다.) 이 방법은 두 종류의 흔한 오류를 보정하는 데 효험이 있는데:

  1. 데이터의 한 자리를 잘못 입력했을 경우
  2. 데이터의 인접한 두 자리를 서로 바꿔 입력했을 경우

사용하는 나눔수와 가중치에 따라서 실제로 잡아 낼 수 있는 오류의 비율이 결정된다. 일반적으로 첫번째 종류를 모두 잡기 위해서는 가중치의 모든 숫자가 나눔수와 서로소가 되어야 하고, 두번째 종류를 모두 잡기 위해서는 인접한 가중치의 차이가 나눔수의 인수들과 서로 달라야 한다.1) 또한 두 케이스 모두 공통적으로 나눔수가 원래 데이터의 진법과 같거나 커야 하는 건 당연한 얘기다.

흔히 사용하는 나눔수인 10은 인수가 두 개(2, 5)씩이나 있어서 데이터의 길이가 조금만 커져도 완벽한 가중치를 선택하는 것이 불가능하며, 따라서 애초에 포기하고 차선책을 선택하거나(국제 상품 번호) 나눔수를 11을 선택하는 경우가 많다. 후자의 경우 체크 숫자에서 10을 표시할 수 있어야 하므로 이를 나타내는 별도의 자리를 쓰거나(ISBN) 10진법에 끼워 맞추기 위해서 다시 나머지 연산을 하는(주민등록번호) 등의 방법을 사용하곤 한다.2)

1) 즉 나눔수 n에 대해 몫환 \mathbb{Z}/n\mathbb{Z}영인자들을 피해야 한다.
2) 후자의 경우 여전히 믓 잡는 오류가 생기지만, 가중치를 잘 조정하면 오류를 못 잡는 경우를 적절히 랜덤하게 분포시키는 것이 가능하긴 하다.

도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2011-05-30 18:25 | 외부 편집기