Click here to Skip to main content
15,884,298 members
Articles / Mobile Apps / Windows Mobile
Article

Luhn' s Algorithm

Rate me:
Please Sign up or sign in to vote.
1.22/5 (19 votes)
8 Dec 2004 56K   1.3K   12   6
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


Written By
Austria Austria
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralActually, this method only needs one line changed to compute the correct Luhn check-digit (the "return" equation is wrong) Pin
kirkaiya6-Aug-09 18:42
kirkaiya6-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? Pin
Peebles3-Mar-05 2:36
Peebles3-Mar-05 2:36 
Generaluse this code... Pin
Joel Thoms18-Jan-05 11:47
Joel Thoms18-Jan-05 11:47 
Questionhow to use Pin
Joel Thoms18-Jan-05 11:41
Joel Thoms18-Jan-05 11:41 
Generalwrote an implementation myslef some time ago Pin
Almighty Bob9-Dec-04 7:02
Almighty Bob9-Dec-04 7:02 
GeneralExplaining my vote Pin
Jason De Arte8-Dec-04 8:45
Jason De Arte8-Dec-04 8:45 

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

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