Luhn 알고리즘 또는 Luhn
공식 ("모듈 10 알고리즘" 이라고도 함). 일반적으로 ID 번호, IMEI 번호, 미국 공급업체 식별 번호 또는 캐나다 사회 보장 번호를 검증하는 데 사용되는 간단한 검증 공식입니다. 이 알고리즘은 IBM 의 과학자 한스가 개발한 것이다.
Peter Luhn 이 만든 특허 출원은 1954 년 6 월 6 일에 제출되었으며 1960 년 8 월 23 일에 허가를 받았습니다. 미국의 특허 번호는 2950048 입니다.
이 알고리즘은 항상 모두가 사용하고 있으며 오늘도 널리 사용되고 있다. ISO/IEC78 12- 1 에 명시되어 있습니다. 그 목적은 암호화 및 보안 해시 기능이 되는 것이 아닙니다. 그 목적은 악의적인 공격이 아니라 의외의 실수를 방지하는 것이다. 많은 신용 카드와 많은 정부 식별 코드는 이 알고리즘을 사용하여 일련의 난수에서 유효한 숫자를 추출합니다.
장점과 단점
루인
이 알고리즘은 단일 코드 오류와 거의 모든 인접한 숫자 전위 오류를 감지합니다. 그러나 09 에서 90 까지의 두 숫자 시퀀스의 오류를 감지하지 않으며 그 반대의 경우도 마찬가지입니다. 10 분의 7 의 동일한 두 자리 오류 (22 와 55 의 교환, 33 과 66 의 교환, 44 와 77 의 교환은 감지되지 않음) 를 감지합니다. 페르호프 알고리즘과 같은 더 복잡한 디지털 검사 알고리즘은 더 많은 전사 오류를 감지할 수 있습니다. 모듈 n 의 Luhn 알고리즘은 Luhn 알고리즘의 확장으로 숫자가 아닌 문자열을 지원합니다. 알고리즘이 오른쪽에서 왼쪽으로 이동하고 0 이 계산 결과에 영향을 미치기 때문입니다. 0 으로 인해 디지털 이동이 발생하거나 일련의 숫자의 시작 부분이 0 으로 채워진 경우에만 계산 결과 생성에 영향을 주지 않습니다. 따라서 1234 부터 000 1234 까지 0 으로 채워도 Luhn 알고리즘을 사용하면 동일한 결과를 얻을 수 있습니다.
이 알고리즘은 핸드헬드 또는 기계 장비의 검사 코드를 계산하기 위해 미국에서 특허를 받았습니다. 그래서 가능한 한 간단하게 해야 한다.
비공식 해석
이 공식은 검사 코드를 통해 일련의 숫자를 검증할 것이다. 체크 코드는 일반적으로 계정에 추가되어 완전한 계정을 형성합니다. 단편적인 계정은 반드시 다음 테스트를 통과해야 합니다.
1. 패리티 비트부터 카운트 (패리티 비트는 일반적으로 장부 끝에 추가됨) 하고 짝수는 오른쪽에서 왼쪽으로 2 를 곱합니다.
2. 결과 결과를 더합니다 (예: 10 = 1 = 1,14 =/kloc-0) 2 를 곱한 결과가 두 자리 숫자라면 직접 9 를 뺀 다음 앞의 자릿수 해체에 더하면 다음과 같다고 말하는 사람들도 있다. (윌리엄 셰익스피어, 윈스턴, 2, 2, 2, 2, 2, 2, 2, 2)
3. 모듈러스 10 의 합계가 0 인 경우 (즉, 덧셈 결과가 0 으로 끝나고 10 의 배수인 경우), 이 숫자 문자열은 Luhn 알고리즘에 따라 유효하며 그 반대의 경우도 마찬가지입니다.
문자열이 "799273987 1" 이라고 가정하면 패리티 비트를 추가하고 마지막 숫자는 799273987 1x 입니다.
계좌 번호: 7 9 9
2 7 3
9 8 7 1 x
짝수에 2: 7 18 94 76 9 를 곱합니다.
16 7 2
엑스선
추가된 번호: 7 9 4 7 6 9 7.
2 =67
검사 코드 x 는 가산수에 9 를 곱한 다음 10 의 강도 (즉, (67*9)mod 10, 가산 합계가 10 의 정수 배라고 합니다 통속적인 말로:
1. 모든 숫자의 합계 계산 (67).
2. 9(603) 를 곱합니다.
3. 마지막 숫자 (3) 를 가져오세요.
결과는 패리티 비트입니다.
체크 비트를 얻는 또 다른 방법은 먼저 모든 자릿수의 합계를 계산하고 10 에서 모든 자릿수와 모듈 10 의 결과를 빼는 것입니다. (67 의 단위는 7 이다. 10-7=3 은 패리티 비트입니다. 통속적인 말로:
1. 모든 숫자의 합계 계산 (67).
2. 자릿수 (7) 를 선택합니다.
3. 10 에서 단위 수 (3) 를 뺍니다.
결과는 패리티 비트입니다.
이렇게 하면 완전한 계정을 얻을 수 있다: 799273987 1x.
다음 번호는 각각 79927398710,79927398711,79927398712,799 입니다
79927398715,79927398716,79927398717,799273987/kloc-
799273987 19 는 다음과 같은 방법으로 검증되었습니다.
1. 맨 오른쪽부터 짝수에 2: (1 * 2) = 2, (8*2)= 16, (3 *)
2. 각 숫자를 더합니다: x (체크 비트)+(2)+7+(1+6)+9+(6)+7+(4)+9+(
3. 결과가 10 의 배수라면 이 계정이 유효할 수 있습니다. 3 은 및 (67+x) 를 10 의 정수 배로 만들 수 있는 유일한 자릿수입니다.
4. 그래서 위 계좌는 799273987 13 을 제외하고는 모두 무효입니다.
패리티 비트 검증의 코드 구현
파이썬은 다음과 같은 기능을 구현했습니다.
Def luhn_checksum (카드 번호):
자릿수 정의하기 (n):
Return [int(d) for d in str(n)]
Digits = digits_of (카드 번호)
Odd _ digits = digits [-1::-2]
짝수 자릿수 = 자릿수 [-2::-2]
체크섬 = 0
체크섬+= 합계 (홀수 비트)
짝수 자리 d 의 경우:
체크섬+= 합계 (d*2 자리)
체크섬% 10 을 반환합니다
Def is_luhn_valid (카드 번호):
Return luhn _ checksum (card _ number) = = 0
패리티 비트 계산
위의 알고리즘은 입력 패리티 비트의 유효성을 검사합니다. 패리티 비트를 계산하려면 작은 적응 알고리즘이 필요합니다.
1. 홀수/짝수 곱셈을 전환합니다.
2. 합계 모듈 10 이 0 이면 체크 코드는 0 입니다.
3. 그렇지 않으면 체크 코드는 10 에서 10 을 뺀 것과10 (10-(summod/;
Defcalculate _ luhn (partial _ card _ number):
10-luhn _ checksum (int (partial _ card _ number) *10) 을 반환합니다