Inicio > PHP > Algoritmo de luhn

ALGORITMO DE LUHN

09/05/2017PHP

 

He usado este algoritmo para la validación de tarjetas de crédito para los proyectos ecommerce que desarrollo. Pero hace unos años lo tuve que utilizar para validar el IMEI de las tarjetas SIM en un proyecto para orange por temas de portabilidad.
Su creador fue Hans Peter Luhn, un científico de IBM y se sigue usando el día de hoy.
El algoritmo de Luhn es bastante sencillo:
Una tarjeta de crédito, o una tarjeta SIM, es válida si obteniendo la reversa de este número, y la suma sus dígitos debe ser un múltiplo de 10, es decir que la suma módulo 10 debe ser igual a cero.
Ésto se ve mejor con un ejemplo:

  • Número de ejemplo: 49927398716
  • Se multiplica 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
  • Se suman los dígitos que ocupan 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. (1+6) es por la multiplicación de 8x2 y (1+8) es por la multiplicación de 9x2 del primer punto
  • Si el resto de dividir el total entre 10 es igual a cero, el número es correcto: 70 mod 10 = 0
En intenet hay ejemplos ya programados pero el código ya hecho sería el siguiente:

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

Nota: Para saber si una tarjeta es Visa o Mastercard saber que las tarjetas Visa empiezan por 4, las tarjetas Mastercard empiezan por 5 y las tarjetas American Express siempre empiezan por 3