Algorytm Luhna
Algorytm Luhna jest stosowany do weryfikacji poprawności numerów, takich jak numery kart kredytowych. Został opracowany przez Hansa Petera Luhna, niemieckiego naukowca, który wynalazł mechaniczne urządzenie do sprawdzania numerów z cyfrą kontrolną. Algorytm pozwala na wykrywanie błędów w pojedynczych cyfrach oraz zamian kolejności sąsiednich cyfr, ale nie potrafi zidentyfikować niektórych zamian oraz przestawień cyfr.
Podstawowe zasady działania
Algorytm działa według następujących kroków:
- Przypisanie wag do cyfr (2 dla pozycji nieparzystych, 1 dla parzystych).
- Mnożenie cyfr przez przypisane wagi od prawej do lewej.
- Dodawanie cyfr z wyników mnożenia, jeśli wynik jest dwucyfrowy, należy je zsumować.
- Sumowanie wszystkich uzyskanych wartości.
- Obliczanie sumy modulo 10.
- Jeśli wynik nie jest zerem, odejmowanie go od 10, aby uzyskać cyfrę kontrolną.
Przykład
Rozważmy liczbę 92480_:
- Mnożenie: 9 x 2 = 18 (suma: 9), 2 x 1 = 2, 4 x 2 = 8, 8 x 1 = 8, 0 x 2 = 0.
- Suma: 9 + 2 + 8 + 8 + 0 = 27.
- 27 mod 10 = 7, więc cyfra kontrolna to 3 (10 – 7).
Pełny numer to 924803. Sprawdzając ten numer, uzyskujemy zero, co oznacza, że jest on poprawny.
Implementacja
Poniżej przedstawione są przykłady implementacji algorytmu w językach VBA i C#.
VBA
Private Function Mod10CheckDigit(Barcode As String) As Integer
' Wyznaczanie cyfry kontrolnej
Dim i As Integer, temp As Integer, alt As Boolean, suma As Integer
Barcode = Trim(Barcode)
suma = 0
alt = True
For i = Len(Barcode) To 1 Step -1
temp = CInt(Mid(Barcode, i, 1))
If alt Then
temp = temp * 2
If (temp > 9) Then temp = temp - 9
End If
suma = suma + temp
alt = Not alt
Next i
Mod10CheckDigit = (10 - (suma Mod 10)) Mod 10
End Function
C#
bool CheckNumber(int[] digits)
{
int sum = 0;
bool alt = false;
for(int i = digits.Length - 1; i >= 0; i--)
{
int temp = digits[i];
if(alt)
{
temp *= 2;
if(temp > 9) temp -= 9;
}
sum += temp;
alt = !alt;
}
return sum % 10 == 0;
}