Click here to Skip to main content
Click here to Skip to main content
Go to top

Luhn' s Algorithm

, 8 Dec 2004
Rate this:
Please Sign up or sign in to vote.
Calculating checksum number using Luhn's algorithm

Introduction

This sample implements the functionality of generating checksum number using Luhn's algorithm.

I've created a class LuhnAlgorithm with a static function:

public static int GetLuhnAlgorithmNumber(string data);

Return value is the generated number.

Definition

The Luhn algorithm or Luhn formula, also known as the "modulus 10" or "mod 10" algorithm, was developed in the 1960s as a method of validating identification numbers. It is a simple checksum formula used to validate a variety of account numbers, such as credit card numbers and Canadian Social Insurance Numbers. Much of its notoriety comes from credit card companies' adoption of it shortly after its creation in the late 1960s by IBM scientist Hans Peter Luhn (1896–1964).

Explanation of the Luhn's algorithm can be found here.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

wapnethr

Austria Austria
No Biography provided

Comments and Discussions

 
GeneralActually, this method only needs one line changed to compute the correct Luhn check-digit (the "return" equation is wrong) Pinmemberkirkaiya6-Aug-09 18:42 
This is an old article, so maybe nobody will read this, but -
 
To the people who posted that the method should start with the second-to-last digit - I don't think that is correct. The author seems (from the title) to have intended this as a function to generate the check-digit, not to validate.
 
That said, his "return" equation has an error. It should be (expressed in VB.Net, which I used):
Return CInt((Math.Truncate(sum / 10) + 1) * 10) - sum
[not (((sum / 10) + 1) * 10) - sum, which is what the source-code has]
 
In other words - the author's code only fails to truncate the result of sum/10, which leads to equation returning 10 [since, for example, if sum = 6, then (((sum/10)+1)*10 - sum = 10 ].
 
After changing the line indicated above, and typing in all but the last digit of four different credit-card numbers (eg., give it a string of 15 digits, don't include the last "check-digit"), the function correctly returned the final digit of all four card-numbers.
 
Here's the entire (corrected)_function in VB.Net for anybody who is too lazy to convert:
 
Public Shared Function GetChecksum(ByVal DecimalString As String) As Integer
    Dim sum As Integer = 0
    Dim odd As Boolean = True
    For i As Integer = DecimalString.Length - 1 To 0 Step -1
        If odd = True Then
            Dim tSum As Integer = Convert.ToInt32(DecimalString(i).ToString()) * 2
            If tSum >= 10 Then
                Dim tData As String = tSum.ToString()
                tSum = Convert.ToInt32(tData(0).ToString()) + Convert.ToInt32(tData(1).ToString())
            End If
            sum += tSum
        Else
            sum += Convert.ToInt32(DecimalString(i).ToString())
        End If
        odd = Not odd
    Next
 
    Return CInt((Math.Truncate(sum / 10) + 1) * 10) - sum
 
End Function

QuestionIncorrect Algorithm? PinmemberPeebles3-Mar-05 2:36 
Generaluse this code... PinmemberJoel Thoms18-Jan-05 11:47 
Questionhow to use PinmemberJoel Thoms18-Jan-05 11:41 
Generalwrote an implementation myslef some time ago Pinmember
MadHatter ¢
9-Dec-04 7:02 
GeneralExplaining my vote PinmemberJason De Arte8-Dec-04 8:45 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140905.1 | Last Updated 8 Dec 2004
Article Copyright 2004 by wapnethr
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid