lunes, septiembre 11, 2006

Desmitificando el DNI con Velneo

Leyendo un día microsiervos encontré en la sección de leyendas urbanas un post sobre el DNI.

Trataba sobre la leyenda que decía que el número que aparece en la parte de atrás del DNI es el número de personas que se llaman igual que tú.

Siguiendo los enlaces encontré la página de Josep Portella Florit donde explicaba el proceso que siguió hasta descifrar la parte de atrás del DNI.

Decidí en ese momento hacer la adaptación a Velneo del proceso y generar una web de coña que generase tu parte de atrás del DNI. Aquí está:

http://80.81.122.226/cgi-vel/dni/

Veamos cómo es esa parte de atrás, algo parecido a esto:

IDESP12345678Z3***************
7410150M0903226ESP***********4
DE*TAL*Y*CUAL**FULANITO*******

Y qué es esto? Por campos,

[ID][ESP][12345678Z][3][***************]
[741015][0][M][090322][6][ESP][***********][4]
[DE*TAL*Y*CUAL][**][FULANITO][*******]

[ID] - Campo que indica el tipo de documento
[ESP] - Campo que indica que el documento es de España
[12345678Z] - Campo con el DNI letra incluida
[3] - Dígito de control del DNI letra incluida
[***************] - Relleno

[741015] - Fecha de nacimiento en formato AAMMDD
[0] - Dígito de control de la fecha de nacimiento
[M] - Sexo
[090322] - Fecha de caducidad del DNI
[6] - Dígito de control de la fecha de caducidad
[ESP] - Campo que indica que el documento es de España
[***********] - Relleno
[4] - Dígito de control de la cadena formada por el DNI letra incluida, su dígito de control, la fecha de nacimiento, su dígito de control, la fecha de caducidad y su dígito de control

[DE*TAL*Y*CUAL] - Apellidos
[**] - Separador
[FULANITO] - Nombre
[*******] - Relleno

Para el cálculo de los rellenos debemos tener en cuenta que la longitud de cada línea es de 30 caracteres.

El cálculo del dígito de control se reduce a tomar una cadena de longitud variable ( DNI, fecha, churro ), separarla caracter por caracter, sustituir los caracteres alfabéticos por su valor numérico según la fórmula (valorASCII - 65), de forma que la A sea 0, la M 12 y la Z 25, y luego aplicar los pesos 7-3-1 a los caracteres de la cadena, obtener la suma total y quedarnos con el último dígito de la suma.

Por pasos,

tomando por ejemplo el DNI [12345678Z]

separamos por caracteres
[ 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - Z ]
sustituimos la letra
[ 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 25 ]
aplicamos los pesos 7-3-1
[ 1*7 - 2*3 - 3*1 - 4*7 - 5*3 - 6*1 - 7*7 - 8*3 - 25*1 ]
sumamos
[ 7 + 6 + 3 + 28 + 15 + 6 + 49 + 24 + 25 ] = 163

nos quedamos con el último dígito [3] y ya tenemos nuestro dígito de control.

Así con todos.

La duda que me queda es el tema del sexo. No interviene en el cálculo de ningún dígito de control pero sufre una transformación que creo es M = Hombre, F = Mujer, aunque en el campo del DNI dedicado al sexo pone otra cosa. No sé si tendrá algo que ver también la comunidad autónoma o no.

Ah! Se me olvidaba comentarlo, al componer la última línea debereis tener en cuenta que si en el Nombre o Apellidos aparecen espacios, estos deberán ser sustituidos por [*]

4 comentarios:

Anónimo dijo...

Me ha parecido muy interesante ya que he sido uno de los pardillos que se creían lo de los nombres coincidentes.

Comparándolo con mi actual DNI veo que ahora han cambiado los asteríscos (*) por el signo menor (<) pero el resto parece ser igual.

Sobre lo que comentabas del sexo, en el mío arriba pone V-M y abajo M y soy un hombre.

En el de las mujeres pone arriba M-F y abajo F.

DomK dijo...

He retirado el link por si la LOPD.

Un saludo,

Anónimo dijo...

No encuentro funciones bien hechas con velneo que validen DNI, CIF, NIF, y NIE, en una base de datos, distinguiendo los extrangeros (X delante). ¿Sabeis donde podria encontrar?

DomK dijo...

Hola angel,

En el mismo almacén de objetos del editor de Velneo tienes un par de funciones que hacen la verificación del NIF y del CIF respectivamente.

Verificar un NIE es lo mismo que verificar un DNI despreciando la X inicial.

Un saludo,