Misplaced Pages

Luhn algorithm: Difference between revisions

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.
Browse history interactively← Previous editContent deleted Content addedVisualWikitext
Revision as of 20:30, 27 May 2013 editWerdna (talk | contribs)Extended confirmed users6,655 edits Description: Remove redundant and confusing passage. Summing the digits is identical to subtracting 9 for two digit numbers less than 20← Previous edit Latest revision as of 21:14, 25 December 2024 edit undoDavidCary (talk | contribs)Extended confirmed users7,117 edits explicit link to article that goes into much more detail on this topic. 
(650 intermediate revisions by more than 100 users not shown)
Line 1: Line 1:
{{Short description|Simple checksum formula}}
The '''Luhn algorithm''' or '''Luhn formula''', also known as the "] 10" or "mod 10" ],
is a simple ] formula used to validate a variety of identification numbers, such as ]s, ]s, ] in US and ] ]s. It was created by ] scientist ] and described in , filed on January 6, 1954, and granted on August 23, 1960.


The '''Luhn algorithm''' or '''Luhn formula''', also known as the "] 10" or "mod 10" ], named after its creator, ] scientist ], is a simple ] formula used to validate a variety of identification numbers. It is described in ] patent 2950048A, granted on {{date|1960-08-23|DMY}}.<ref name="US2950048A">{{cite patent|title=Computer for Verifying Numbers|country=US|number=2950048A|status=patent|pubdate={{date|1960-08-23|DMY}}|gdate={{date|1960-08-23|DMY}}|invent1=Luhn|inventor1-first=Hans Peter|fdate=1954-01-06|inventorlink=Hans Peter Luhn}}</ref>
The algorithm is in the ] and is in wide use today. It is specified in ]-1.<ref></ref> It is not intended to be a ]; it was designed to protect against accidental errors, not malicious attacks. Most credit cards and many government identification numbers use the algorithm as a simple method of distinguishing valid numbers from collections of random digits.

The algorithm is in the ] and is in wide use today. It is specified in ].<ref>{{cite tech report|title=Identification cards {{mdash}} Identification of issuers {{mdash}} Part 1: Numbering system|number=]-1:{{date|2017|DMY}}|institution=] & ]|date={{date|Jan 2017|DMY}}|type=standard|url=https://www.iso.org/standard/70484.html|chapter=Annex B: Luhn formula for computing modulus-10 “double-add-double” check digits}}</ref> It is not intended to be a ]; it was designed to protect against accidental errors, not malicious attacks. Most ]s and many ] use the algorithm as a simple method of distinguishing valid numbers from mistyped or otherwise incorrect numbers.


==Description== ==Description==
The check digit is computed as follows:
The formula verifies a number against its included ], which is usually appended to a partial account number to generate the full account number. This account number must pass the following test:
# Drop the check digit from the number (if it's already present). This leaves the payload.
# Start with the payload digits. Moving from right to left, double every second digit, starting from the last digit. If doubling a digit results in a value > 9, subtract 9 from it (or sum its digits).
# Sum all the resulting digits (including the ones that were not doubled).
# The check digit is calculated by <math>(10 - (s \bmod 10)) \bmod 10</math>, where s is the sum from step 3. This is the smallest number (possibly zero) that must be added to <math>s</math> to make a multiple of 10. Other valid formulas giving the same value are <math>9 - ((s + 9)\bmod 10)</math>, <math>(10 - s)\bmod 10</math>, and <math>10\lceil s/10\rceil - s</math>. Note that the formula <math>(10 - s)\bmod 10</math> will not work in all environments due to differences in how negative numbers are handled by the ] operation.


=== Example for computing check digit ===
# From the rightmost digit, which is the check digit, moving left, double the value of every second digit; if product of this doubling operation is greater than 9 (e.g., 7 * 2 = 14).
# Sum the digits of the products (e.g., 10: 1 + 0 = 1, 14: 1 + 4 = 5) together with the undoubled digits from the original number.
# If the total ] 10 is equal to 0 (if the total ends in zero) then the number is valid according to the Luhn formula; else it is not valid.


Assume an example of an account number "7992739871" that will have a check digit added, making it of the form 7992739871x: Assume an example of an account number 1789372997 (just the "payload", check digit not yet included):


{| class="wikitable" style="text-align:center" {| class="wikitable" style="text-align:center;border:none;background:transparent;"4353464434047422| style="width:1.5em" | 4283039836977353| style="width:1.5em" | 9
| style="width:1.5em" |
! Account number
| style="width:1.5em" | 7 | style="width:1.5em" | 7
| style="width:1.5em" | 9 | style="width:1.5em" | 9
Line 25: Line 28:
| style="width:1.5em" | 7 | style="width:1.5em" | 7
| style="width:1.5em" | 1 | style="width:1.5em" | 1
| style="width:1.5em" | x
|- |-
! Multipliers
! Double every other
| 7 | 2
| 1
| style="background: #FFA;" | 18
| 2
| 1
| 2
| 1
| 2
| 1
| 2
| 1
|-
!
| =
| =
| =
| =
| =
| =
| =
| =
| =
| =
|-
!
| style="background: #FFA;" | '''14'''
| 9 | 9
| style="background: #FFA;" | 4 | style="background: #FFA;" | '''18'''
| 7 | 2
| style="background: #FFA;" | 6 | style="background: #FFA;" | '''14'''
| 9 | 3
| style="background: #FFA;" | 16 | style="background: #FFA;" | '''18'''
| 7 | 8
| style="background: #FFA;" | 2 | style="background: #FFA;" | '''14'''
| x | 1
|- |-
! Sum of digits ! Sum digits
|'''5''' (1+4)
|7
|9
|9
|4
|7
|6
|9 |9
|'''9''' (1+8)
|7
|7
|2 |2
|=6'''7''' |'''5''' (1+4)
|3
|'''9''' (1+8)
|8
|'''5''' (1+4)
|1
|} |}


The sum of the resulting digits is 56.
The check digit (x) is obtained by computing the sum of digits then computing 9 times that value modulo 10 (in equation form, (67 * 9 mod 10)). In algorithm form:


The check digit is equal to <math>(10 - (56 \bmod 10))\bmod 10 = 4</math>.
# Compute the sum of the digits (67).
# Multiply by 9 (603).
# The last digit, 3, is the check digit.


This makes the full account number read 17893729974.
(Alternate method)
The check digit (x) is obtained by computing the sum of digits then subtracting the units digit from 10 (67 = Units digit 7; 10 − 7 = check digit 3). In algorithm form:


=== Example for validating check digit ===
# Compute the sum of the digits (67).
# Take the units digit 7.
# Subtract the units digit from 10.
# The result, 3, is the check digit.


# Drop the check digit (last digit) of the number to validate. (e.g. 17893729974 &rarr; 1789372997)
This, makes the full account number read 79927398713.
# Calculate the check digit (see above)

# Compare your result with the original check digit. If both numbers match, the result is valid. {{nowrap|1=(e.g. (givenCheckDigit = calculatedCheckDigit) &hArr; (isValidCheckDigit)).}}
Each of the numbers 79927398710, 79927398711, 79927398712, 79927398713, 79927398714, 79927398715, 79927398716, 79927398717, 79927398718, 79927398719 can be validated as follows.

#Double every second digit, from the rightmost: (1×2) = 2, (8×2) = 16, (3×2) = 6, (2×2) = 4, (9×2) = 18
<!--

THERE HAVE BEEN MULTIPLE ERRONEOUS "CORRECTIONS" TO THIS ALGORITHM! PLEASE READ:
Are you about to delete the "+" from "(1+6)" and "(1+8)"? PLEASE DON'T! The algorithm sums the INDIVIDUAL DIGITS, not numbers. Thus, "(1+6)" is more illustrative of what is being done.
If you leave it as "1 + (2) + 7 + (16) + 9 + (6) + 7 + (4) + 9 + (18) + 4" it sums to 88, not 70. This is just plain wrong.

Another formulation:
mod 10
except that each 'mod 9' produces 9 rather than zero if it divides evenly.

The description I found here was *also* incorrect however. It said you take the result of the sum, and divide it by 10 and then *truncate* it. Truncation is basically the *opposite* of taking the modulus. It happens to work out in the case because the sum is 64, but if the sum were 74, you'd get: 74 / 10 = 7.4, which truncates to 7. I've changed it so the sum is 65, which accordingly to the previous description I read would mean the check digit is still a 6, but in fact it should be a 5. I did my best to rephrase it to something that was mathematically correct and provided my poor attempt at a layman's instructions on how to do the computation. Feel free to correct it, but don't put it back to "truncation". That'd be most bad. I would actually advocate using a different number whose sum isn't a multiple of 9 to avoid this mistake being reintroduced.

-->
#Sum all the ''individual'' digits (digits in parentheses are the products from Step 1): x (the check digit) + (2) + 7 + (1+6) + 9 + (6) + 7 + (4) + 9 + (1+8) + 7 = x + 67.
#If the sum is a multiple of 10, the account number is possibly valid. Note that '''3''' is the only valid digit that produces a sum (70) that is a multiple of 10.
#Thus these account numbers are all invalid except possibly 79927398713 which has the correct check digit.


==Strengths and weaknesses== ==Strengths and weaknesses==
The Luhn algorithm will detect any single-digit error, as well as almost all transpositions of adjacent digits. It will not, however, detect transposition of the two-digit sequence ''09'' to ''90'' (or vice versa). It will detect 7 of the 10 possible twin errors (it will not detect ''22'' ↔ ''55'', ''33'' ↔ ''66'' or ''44'' ↔ ''77''). The Luhn algorithm will detect all single-digit errors, as well as almost all transpositions of adjacent digits. It will not, however, detect transposition of the two-digit sequence ''09'' to ''90'' (or vice versa). It will detect most of the possible twin errors (it will not detect ''22'' ↔ ''55'', ''33'' ↔ ''66'' or ''44'' ↔ ''77'').


Other, more complex check-digit algorithms (such as the ] and the ]) can detect more transcription errors. The ] is an extension that supports non-numerical strings. Other, more complex check-digit algorithms (such as the ] and the ]) can detect more transcription errors. The ] is an extension that supports non-numerical strings.
Line 97: Line 97:
Because the algorithm operates on the digits in a right-to-left manner and zero digits affect the result only if they cause shift in position, zero-padding the beginning of a string of numbers does not affect the calculation. Therefore, systems that pad to a specific number of digits (by converting 1234 to 0001234 for instance) can perform Luhn validation before or after the padding and achieve the same result. Because the algorithm operates on the digits in a right-to-left manner and zero digits affect the result only if they cause shift in position, zero-padding the beginning of a string of numbers does not affect the calculation. Therefore, systems that pad to a specific number of digits (by converting 1234 to 0001234 for instance) can perform Luhn validation before or after the padding and achieve the same result.


The algorithm appeared in a United States Patent<ref name="US2950048A" /> for a simple, hand-held, mechanical device for computing the checksum. The device took the mod 10 sum by mechanical means. The ''substitution digits'', that is, the results of the double and reduce procedure, were not produced mechanically. Rather, the digits were marked in their permuted order on the body of the machine.
Prepending a 0 to odd-length numbers enables you to process the number from left to right rather than right to left, doubling the odd-place digits.

The algorithm appeared in a US Patent for a hand-held, mechanical device for computing the checksum. It was therefore required to be rather simple. The device took the mod 10 sum by mechanical means. The ''substitution digits'', that is, the results of the double and reduce procedure, were not produced mechanically. Rather, the digits were marked in their permuted order on the body of the machine.

==Implementation of standard Mod 10==
The implementations below are in ].
===Verification of the check digit===

<!--
Do not add more code to this article. See the talk page before editing. The manual of style discourages multiple code samples, as they are rarely of encyclopedic value.
-->

<source lang="python">
def luhn_checksum(card_number):
def digits_of(n):
return
digits = digits_of(card_number)
odd_digits = digits
even_digits = digits
checksum = 0
checksum += sum(odd_digits)
for d in even_digits:
checksum += sum(digits_of(d*2))
return checksum % 10


== Pseudocode implementation ==
def is_luhn_valid(card_number):
return luhn_checksum(card_number) == 0
</source>


The following function takes a card number, including the check digit, as an array of integers and outputs '''true''' if the check digit is correct, '''false''' otherwise.
===Calculation of the check digit===
The algorithm above checks the validity of an input with a check digit. Calculating the check digit requires only a slight adaptation of the algorithm—namely:
# Append a zero check digit to the partial number and calculate checksum
# If the (sum mod 10) == 0, then the check digit is 0
# Else, the check digit = 10 - (sum mod 10)


'''function''' isValid(cardNumber)
<!--
sum := 0
Do not add more code to this article. See the talk page before editing. The manual of style discourages multiple code samples, as they are rarely of encyclopedic value.
parity := length mod 2
-->
'''for''' i from 1 to length '''do'''
<source lang="python" style="margin-top: 1em">
'''if''' i mod 2 != parity '''then'''
def calculate_luhn(partial_card_number):
sum := sum + cardNumber
check_digit = luhn_checksum(int(partial_card_number) * 10)
'''elseif''' cardNumber > 4 '''then'''
return check_digit if check_digit == 0 else 10 - check_digit
sum := sum + 2 * cardNumber - 9
</source>
'''else'''
sum := sum + 2 * cardNumber
'''end if'''
'''end for'''
'''return''' cardNumber == ((10 - (sum mod 10)) mod 10)
'''end function'''


==See also== == Uses ==
The Luhn algorithm is used in a variety of systems, including:
* ]
* ]
* ]
* ] in the United States
* ] ]s
* ] ID numbers
* ] ID numbers
* ] Tax reference numbers
* ] ]s
* ] Corporate Identity Numbers (OrgNr)
* ] Social Security Numbers (ΑΜΚΑ)
* ] of SIM cards
* ] application numbers
* Survey codes appearing on ], ], and ] receipts
* ] package tracking numbers use a modified Luhn algorithm<ref>{{Cite book |url=https://postalpro.usps.com/mnt/glusterfs/2023-10/Pub%20199_v28_10102023.pdf |title=Publication 199: Intelligent Mail Package Barcode (IMpb) Implementation Guide for Confirmation Services and Electronic Payment Systems |date={{date|2023-10-10|DMY}} |publisher=] |edition=28th |location=] |language=en |access-date={{date|2023-11-29|DMY}} |archive-url=https://web.archive.org/web/20231117004502id_/https://postalpro.usps.com/mnt/glusterfs/2023-10/Pub%20199_v28_10102023.pdf |archive-date={{date|2023-11-17|DMY}} |url-status=live}}</ref>
* Italian VAT numbers (])<ref>{{Cite web |last=Albanese |first=Ilenia |date={{date|2022-08-10|DMY}} |title=A cosa serve la Partita Iva? Ecco cosa sapere |trans-title=What is a VAT number for? Here's what to know |url=https://www.partitaiva.it/partita-iva-cosa-serve/ |url-status=live |archive-url=https://web.archive.org/web/20240629162018/https://www.partitaiva.it/partita-iva-cosa-serve/ |archive-date={{date|2024-06-29|DMY}} |access-date={{date|2024-06-29|DMY}} |website=Partitaiva.it |language=it}}</ref>


==References== ==References==
<references/> <references/>
*{{US patent|2950048}}, ''Computer for Verifying Numbers'', Hans P. Luhn, August 23, 1960.


==External links== ==External links==
* on ]: Luhn algorithm/formula implementation in 160 programming languages {{As of|1=2024|2=07|3=22|lc=y|url=https://rosettacode.org/search/?title=Luhn_test_of_credit_card_numbers&action=history}}
*
*
*
* Ruby: ,
*


{{DEFAULTSORT:Luhn Algorithm}} {{DEFAULTSORT:Luhn Algorithm}}
] ]
] ]
]
] ]
]
]
]

Latest revision as of 21:14, 25 December 2024

Simple checksum formula

The Luhn algorithm or Luhn formula, also known as the "modulus 10" or "mod 10" algorithm, named after its creator, IBM scientist Hans Peter Luhn, is a simple check digit formula used to validate a variety of identification numbers. It is described in US patent 2950048A, granted on 23 August 1960.

The algorithm is in the public domain and is in wide use today. It is specified in ISO/IEC 7812-1. It is not intended to be a cryptographically secure hash function; it was designed to protect against accidental errors, not malicious attacks. Most credit card numbers and many government identification numbers use the algorithm as a simple method of distinguishing valid numbers from mistyped or otherwise incorrect numbers.

Description

The check digit is computed as follows:

  1. Drop the check digit from the number (if it's already present). This leaves the payload.
  2. Start with the payload digits. Moving from right to left, double every second digit, starting from the last digit. If doubling a digit results in a value > 9, subtract 9 from it (or sum its digits).
  3. Sum all the resulting digits (including the ones that were not doubled).
  4. The check digit is calculated by ( 10 ( s mod 1 0 ) ) mod 1 0 {\displaystyle (10-(s{\bmod {1}}0)){\bmod {1}}0} , where s is the sum from step 3. This is the smallest number (possibly zero) that must be added to s {\displaystyle s} to make a multiple of 10. Other valid formulas giving the same value are 9 ( ( s + 9 ) mod 1 0 ) {\displaystyle 9-((s+9){\bmod {1}}0)} , ( 10 s ) mod 1 0 {\displaystyle (10-s){\bmod {1}}0} , and 10 s / 10 s {\displaystyle 10\lceil s/10\rceil -s} . Note that the formula ( 10 s ) mod 1 0 {\displaystyle (10-s){\bmod {1}}0} will not work in all environments due to differences in how negative numbers are handled by the modulo operation.

Example for computing check digit

Assume an example of an account number 1789372997 (just the "payload", check digit not yet included):

7 9 9 2 7 3 9 8 7 1
Multipliers 2 1 2 1 2 1 2 1 2 1
= = = = = = = = = =
14 9 18 2 14 3 18 8 14 1
Sum digits 5 (1+4) 9 9 (1+8) 2 5 (1+4) 3 9 (1+8) 8 5 (1+4) 1

The sum of the resulting digits is 56.

The check digit is equal to ( 10 ( 56 mod 1 0 ) ) mod 1 0 = 4 {\displaystyle (10-(56{\bmod {1}}0)){\bmod {1}}0=4} .

This makes the full account number read 17893729974.

Example for validating check digit

  1. Drop the check digit (last digit) of the number to validate. (e.g. 17893729974 → 1789372997)
  2. Calculate the check digit (see above)
  3. Compare your result with the original check digit. If both numbers match, the result is valid. (e.g. (givenCheckDigit = calculatedCheckDigit) ⇔ (isValidCheckDigit)).

Strengths and weaknesses

The Luhn algorithm will detect all single-digit errors, as well as almost all transpositions of adjacent digits. It will not, however, detect transposition of the two-digit sequence 09 to 90 (or vice versa). It will detect most of the possible twin errors (it will not detect 2255, 3366 or 4477).

Other, more complex check-digit algorithms (such as the Verhoeff algorithm and the Damm algorithm) can detect more transcription errors. The Luhn mod N algorithm is an extension that supports non-numerical strings.

Because the algorithm operates on the digits in a right-to-left manner and zero digits affect the result only if they cause shift in position, zero-padding the beginning of a string of numbers does not affect the calculation. Therefore, systems that pad to a specific number of digits (by converting 1234 to 0001234 for instance) can perform Luhn validation before or after the padding and achieve the same result.

The algorithm appeared in a United States Patent for a simple, hand-held, mechanical device for computing the checksum. The device took the mod 10 sum by mechanical means. The substitution digits, that is, the results of the double and reduce procedure, were not produced mechanically. Rather, the digits were marked in their permuted order on the body of the machine.

Pseudocode implementation

The following function takes a card number, including the check digit, as an array of integers and outputs true if the check digit is correct, false otherwise.

function isValid(cardNumber)
    sum := 0
    parity := length mod 2
    for i from 1 to length do
        if i mod 2 != parity then
            sum := sum + cardNumber
        elseif cardNumber > 4 then
            sum := sum + 2 * cardNumber - 9
        else
            sum := sum + 2 * cardNumber
        end if
    end for
    return cardNumber == ((10 - (sum mod 10)) mod 10)
end function

Uses

The Luhn algorithm is used in a variety of systems, including:

References

  1. ^ US patent 2950048A, Luhn, Hans Peter, "Computer for Verifying Numbers", published 23 August 1960, issued 23 August 1960 
  2. "Annex B: Luhn formula for computing modulus-10 "double-add-double" check digits". Identification cards — Identification of issuers — Part 1: Numbering system (standard). International Organization for Standardization & International Electrotechnical Commission. January 2017. ISO/IEC 7812-1:2017.
  3. Publication 199: Intelligent Mail Package Barcode (IMpb) Implementation Guide for Confirmation Services and Electronic Payment Systems (PDF) (28th ed.). United States: United States Postal Service. 10 October 2023. Archived (PDF) from the original on 17 November 2023. Retrieved 29 November 2023.
  4. Albanese, Ilenia (10 August 2022). "A cosa serve la Partita Iva? Ecco cosa sapere" [What is a VAT number for? Here's what to know]. Partitaiva.it (in Italian). Archived from the original on 29 June 2024. Retrieved 29 June 2024.

External links

Categories: