Y empezamos nuestro bonito blog con una necesidad simple pero muy solicitada, e incluso diría que a este dígito verificador DNI, algunas plataformas lo usan como método de validación infalible para tener la certeza de que no eres un robot, tal vez tú vengas de una de esas plataformas
Pero no quiero expandirme con argumentos no sólidos, ni venderte publicidad para que compres galletas, centrémonos en lo que nos interesa, y si estás leyendo esta parte es porque ya te gustó mi forma de redactar (Recuerda que es mi blog personal)

¿Realmente el dígito verificador es un algoritmo matemático?
Y la respuesta es afirmativa, además el dígito verificador del DNI es el mismo dígito generado en el último número de un RUC. Si nos centramos netamente en los DNI, entonces bastaría con colocar un 10 delante del DNI concatenado al dígito verificador para obtener el RUC de 11 dígitos
¿Cuál es la lógica matemática para calcular el dígito verificador a partir de un número de DNI?
Primero mencionar que ésta no es una fórmula de oro oculta, es simplemente leer la documentación y explicar apropiadamente
- Multiplicamos cada dígito de los 8 dígitos del DNI por los siguientes números: 3, 2, 7, 6, 5, 4, 3 y 2
- A la suma total producto del primer punto, le sumamos 5
- Calculamos el resto, dividiendo la suma total del punto anterior entre 11
- Si el resto es igual a 1, el dígito verificador es 0.
Si el resto es igual a 0, el dígito verificador es 1
Caso contrario el dígito verificador es 11 menos el resto
Acá un pequeño ejemplo con un DNI generado aleatoriamente (DNI 78654321)
- Suma = 7(3) +8(2) + 6(7) + 5(6) + 4(5) + 3(4) + 2(3) + 1(2) => Suma = 149
- Suma = Suma +5 => Suma = 154
- Suma / 11 => 154 / 11 => El resto es 0, ya que el cociente es 14
- Como el resto es 0, entonces el dígito verificador es 1 => Dígito = 1
Creando una función en VBA y Python
Muy bien, entonces ya inspeccionamos, analizamos y solo queda el programar, pero no en Pseint
Código en VBA
Function consultaDigiVeri1(DNI As String) As Boolean
On Error GoTo LuisR
Dim suma As Integer, resto As Integer, complemento As Byte
On Error Resume Next
If Len(DNI) <> 8 Then
Exit Function
End If
suma = 5 + Val(Mid(DNI, 1, 1)) * 3 + Val(Mid(DNI, 2, 1)) * 2 + Val(Mid(DNI, 3, 1)) * 7 + Val(Mid(DNI, 4, 1)) * 6 + Val(Mid(DNI, 5, 1)) * 5 + Val(Mid(DNI, 6, 1)) * 4 + Val(Mid(DNI, 7, 1)) * 3 + Val(Mid(DNI, 8, 1)) * 2
resto = suma Mod 11
complemento = IIf(resto = 1, 0, Val(Left(11 - resto, 1)))
Erase dataR
ReDim dataR(0)
dataR(0) = complemento
consultaDigiVeri1 = True
Exit Function
LuisR:
consultaDigiVeri1 = False
End Function
Código en Py
def consulta_digi_veri1(dni: str) -> bool:
if len(dni) != 8:
return False
try:
suma = (5 + int(dni[0]) * 3 + int(dni[1]) * 2 + int(dni[2]) * 7 +
int(dni[3]) * 6 + int(dni[4]) * 5 + int(dni[5]) * 4 +
int(dni[6]) * 3 + int(dni[7]) * 2)
resto = suma % 11
complemento = 0 if resto == 1 else 11 - resto
data_r = [complemento]
return True
except ValueError:
return False
Palabras extras
Si bien el dígito verificador DNI es muy útil para realizar cálculos, o saltar validadores de juguete que encontremos en la web, debemos tener en cuenta que no es seguro para validar la identidad de una persona y mucho menos accesos
Fuentes: gob.pe, ingluisrojas.com
Sin comentarios