Dzisiaj jest 25 stycznia 2025 r.
Chcę dodać własny artykuł
Reklama

Algorytm Luhna

Chcę dodać własny artykuł

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;
}

Linki zewnętrzne