viernes, julio 06, 2007

Los números del DNI

¿Te has presguntado alguna vez qué significan los números de la parte posterior de tu DNI? Sí, ya, seguro que sabes que el número solitario de la derecha es el número de personas que se llaman como tú... ¿de verdad te crees eso? ¿Qué base tiene? ¿Quién te lo ha contado?

Anda, anda, os voy a enseñar a no creer más leyendas urbanas y a contrastar la información que os dé cualquier piltrafilla con la información testeada y demostrada. Os voy a enseñar los trucos del DNI:

La zona trasera del DNI está compuesta por caracteres OCR, es decir, está preparada para ser leída por máquinas. Ese dígito en concreto, el de la leyenda urbana, es sólo un dígito de control para verificar que se ha leído correctamente.
Vamos a identificar cada uno de los campos que forman la zona de datos OCR y se a explicar el algoritmo utilizado para la generación de los dígitos de control:

IDESP12345678Z3<<<<<<<<<<<<<<<
8307080M0903226ESP<<<<<<<<<<<4
NOMBRE

Esto es lo que pone en cualquier DNI. Lo primero es dividir todo este barullo:

1.-[ID] 2.-[ESP] 3.-[12345678Z] 4.-[3]
Lo primero es el tipo de documento: IDentificación.
Lo segundo es la nación: ESPaña.
Lo tercero es el número de tu DNI.
Lo cuarto es un dígito de control que más adelante se demostrará.

5.-[830708] 6.-[2] 7.-[M] 8.-[090322] 9.-[6] 10.-[ESP]<<<<<<<<<<<11.-[4]
Lo quinto es la fecha de nacimiento en formato AA/MM/DD
Lo sexto es el dígito de control de la fecha de nacimiento.
Lo septimo es el sexo de la persona.
Lo octavo es la fecha de caducidad del DNI.
Lo noveno es el dígito de control de dicha fecha.
Lo décimo es la nacionalidad: ESPañol.
Lo undécimo es el dígito de control de los campos 3, 4, 6, 7, 9 y 10 concatenados

La última parte es el nombre de cada uno.

Los dígitos de control se generan a partir de otros campos a los cuales se les aplica un algoritmo sencillo. Primero se ha de separar por caracteres, por ejemplo, si el valor del campo es 12345678Z:

1 2 3 4 5 6 7 8 Z

Si alguno de los caracteres es una letra, se ha de cambiar por su valor numérico:

A 0   F 5   K 10   P 15   U 20   Z 25
B 1 G 6 L 11 Q 16 V 21
C 2 H 7 M 12 R 17 W 22
D 3 I 8 N 13 S 18 X 23
E 4 J 9 O 14 T 19 Y 24

Así que tenemos:

1 2 3 4 5 6 7 8 25

A estos números se les ha de aplicar el peso 7-3-1, lo que significa que se han de multiplicar por 7, por 3 o por 1 dependiendo de su posición:

1  2  3  4  5  6  7  8  25
7 3 1 7 3 1 7 3 1
--------------------------
7 6 3 28 15 6 49 24 25

A continuación se han de sumar los resultados de todas las multiplicaciones:

7 + 6 + 3 + 28 + 15 + 6 + 49 + 24 + 25 = 163

El dígito de control es el último dígito del resultado de la suma, 3 en este caso.

¿Complicado? ¡Anda ya! Se soluciona con un poquito de programación en C:

int
check_digit(char *s)
{
static int m[3] = { 7, 3, 1 };
int i, n;

for (i = n = 0; s[i] != '\0'; i++)
if (isdigit(s[i]))
n += (s[i] - '0') * m[i % 3];
else if (isalpha(s[i]))
n += (toupper(s[i]) - 'A') * m[i % 3];
else
return -1;
return n % 10;
}
Ahora sólo queda me que creáis todo esto. Probad con vuestro DNI a hacer estas cosas, o mejor, podéis comprobarlo desde AQUI, donde está implementado el código que antes he puesto.

Y ¿ahora qué? ¿Seguís creyendo que el último dígito es el número de personas que se llaman como tú? XD

No hay comentarios:

Publicar un comentario