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)

dígito verificador DNI

¿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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *