El algoritmo de Luhn se usa para la verificación de números de identificación, como los números de las tarjetas de crédito (Visa, MasterCard) o el IMEI de los teléfonos móviles. Su creador fue Hans Peter Luhn, un científico de IBM.
Explicación
El último dígito del número es su dígito de control. Explicaremos el algoritmo de validación con un ejemplo.
Tenemos el número 49927398716.
- Multiplicamos por 2 los dígitos que ocupan las posiciones pares empezando por el final:
(1×2) = 2, (8×2) = 16, (3×2) = 6, (2×2) = 4, (9×2) = 18 - Sumamos los dígitos que ocupaban las posiciones impares con los dígitos de los productos obtenidos:
6 + (2) + 7 + (1+6) + 9 + (6) + 7 + (4) + 9 + (1+8) + 4 = 70 - Si el resto de dividir el total entre 10 es igual a cero, el número es correcto:
70 mod 10 = 0
En la Wikipedia hay implementaciones en varios lenguajes para la verificación de estos números y una implementación en Java para el cálculo del dígito de control.
También dejo aquí una implementación en PHP para la verificación, bastante optimizada y reducida:
function luhn($number) { $odd = true; $sum = 0; foreach ( array_reverse(str_split($number)) as $num) { $sum += array_sum( str_split(($odd = !$odd) ? $num*2 : $num) ); } return (($sum % 10 == 0) && ($sum != 0)); }
Muy claro la explicación del Algoritmo, estoy trabajando en una implementación similar. Tu implementación del algoritmo de Luhn en PHP quedo bastante simplificada, solo para ahorrarnos un nanosegundo podriamos hacer un corrimiento a la izquierda en lugar de multiplicar por 2.
$sum += array_sum(str_split(($odd = !$odd) ? $num << 1 : $num));