martes, 16 de noviembre de 2010

El algoritmo Luhn (Verificación de IMEI en teléfono móviles y otros códigos)

El algoritmo Luhn es un algoritmo que se usa para la verificación de números de identificación. Ejemplos de estos números: el IMEI en los celulares , los números de tarjetas de crédito. Su creador fue por Hans Peter Luhn un científico de la IBM.

El algoritmo es usado para evitar posibles errores al teclear estos números únicos.
Por ejemplo para verificar que un numero IMEI de celular, es válido se tiene en cuenta que este código es de 15 dígitos, y este algoritmo con los primeros 14 dígitos puede prever el digito 15.

En la web de Desbloqueo de Celulares vía IMEI: www.movilserver.com , se implementa este algoritmo para el cálculo automático de el ultimo digito, de manera que si un cliente teclea mal algunos de los primeros 14 dígitos, se dará cuenta pues no le coincidirá el digito 15 (automáticamente calculado) con el de su celular.

El algoritmo escrito en JAVASCRIPT para el cálculo a nivel de navegador es el siguiente:


function Calculate(Luhn)
{
var sum = 0;
for (i=0; i {
sum += parseInt(Luhn.substring(i,i+1));
}
var delta = new Array (0,1,2,3,4,-4,-3,-2,-1,0);
for (i=Luhn.length-1; i>=0; i-=2 )
{
var deltaIndex = parseInt(Luhn.substring(i,i+1));
var deltaValue = delta[deltaIndex];
sum += deltaValue;
}
var mod10 = sum % 10;
mod10 = 10 - mod10;
if (mod10==10)
{
mod10=0;
}
return mod10;
}


El algoritmo escrito en PHP para la validación del lado del cliente es el siguiente:


function CalculateLuhn($Luhn)
{
$len = strlen($Luhn);
// return 5;

$sum = 0;
for ($i=0; $i< $len; $i++ )
{
$sum += intval( substr($Luhn,$i,1));
}
$delta = array(0,1,2,3,4,-4,-3,-2,-1,0);

for ($i = $len-1; $i>=0; $i-=2 )
{
$deltaIndex = intval(substr($Luhn,$i,1));
$deltaValue = $delta[$deltaIndex];
$sum += $deltaValue;
}
$mod10 = $sum % 10;
$mod10 = 10 - $mod10;
if ($mod10==10)
{
$mod10=0;
}
return $mod10;
}