Inicio / Desarrollo web / Algoritmo de Luhn en PHP

Algoritmo de Luhn en PHP

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.

  1. 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
  2. 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
  3. Si el resto de dividir el total entre 10 es igual a cero, el número es correcto:
    70 mod 10 = 0

Algoritmo de Luhn

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

También puedes ver...

Por qué necesitas la tecnología

¿Por qué te hacen falta los equipos electrónicos?

Al día de hoy ya no es un secreto que la tecnología ha llegado para …

4 Comentarios

  1. 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));

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *