Casi todos los esquemas de numeración que resisten el paso del tiempo comparten un mismo truco: reservan el último carácter para que lo determine el resto de la cadena mediante una fórmula pública. Esa fórmula se presenta a menudo como si cada institución hubiera inventado algo distinto, cuando en realidad casi todas pertenecen a la misma familia. Reconocer el parentesco ahorra muchísimo trabajo, porque permite reutilizar una misma pieza de software para esquemas que parecen no tener nada que ver. Esta página describe la forma común, las diferencias que separan a sus miembros y los criterios para escoger uno.
¿Cuántas familias de algoritmos de dígito verificador existen?
Contando de forma estricta, existen varias familias, pero una sola es la que aparece por todas partes en documentos, cuentas bancarias, tarjetas y códigos de producto. Su forma general tiene cuatro pasos y siempre se ejecuta en el mismo orden:
- Asignar una ponderación a cada posición de la cadena, según la distancia al final.
- Multiplicar cada carácter por su ponderación y sumar los resultados.
- Dividir esa suma entre un módulo fijo y quedarse con el resto.
- Traducir el resto a un carácter, a veces tomando su complemento respecto al módulo.
Cualquier miembro de la familia se describe respondiendo a esas cuatro preguntas: qué ponderaciones usa, con qué módulo divide, cómo traduce el resto y si el carácter calculado se coloca al final o en otra posición. La familia incluye un conjunto de estándares internacionales de comprobación, y dentro de ella el más conocido para cuentas bancarias es el que trabaja con el módulo noventa y siete.
Diferencias entre mod-10, mod-11 y mod-97
La manera más rápida de entender la familia es comparar sus tres miembros habituales por lo que cambia en cada uno.
| Miembro | Módulo con el que se divide | Traducción habitual del resto |
|---|---|---|
| mod-10 | Diez | El complemento respecto al módulo da una cifra |
| mod-11 | Once | El resto o su complemento, con una salida adicional cuando conviene |
| mod-97 | Noventa y siete | Se convierte en uno o dos caracteres, y admite letras convertidas antes de calcular |
La diferencia entre mod-10 y mod-11 no está en la idea, sino en cuántos valores distintos puede tomar el residuo. Un módulo más pequeño obliga a más reglas de traducción; un módulo grande, en cambio, necesita reservar más espacio para el propio dígito verificador, porque los restos posibles son muchos más.
El caso del módulo noventa y siete merece una mención aparte porque trabaja con una cadena mágica: convierte las letras en cifras siguiendo una regla fija antes de empezar, y coloca el resultado en una posición intermedia en lugar del final. Esa variante se usa en la verificación de las cuentas bancarias internacionales, cuyo detalle se desarrolla en la guía sobre la estructura del IBAN y la verificación mod-97.
Ponderación y módulo: los parámetros que cambian dentro de una familia
Dentro de una misma familia las diferencias se reducen a tres decisiones de diseño, y conviene tenerlas presentes porque explican casi todas las confusiones al comparar esquemas.
- Las ponderaciones. Pueden ser fijas por posición o alternarse según la distancia al final. También son las responsables de la dirección de lectura: empezar a ponderar por la izquierda o por la derecha cambia el resultado aunque la cadena sea la misma.
- El módulo. Un módulo mayor reparte mejor los residuos y detecta más variantes de error, pero complica la traducción del resto a un único carácter.
- La traducción del resto. Aquí aparecen los trucos conocidos: tomar el complemento, dejar pasar el resto tal cual o reservar un símbolo especial para el caso en que el residuo no cabe en el alfabeto disponible.
Hay un detalle que sorprende a mucha gente: en algunos miembros de la familia el residuo se traduce directamente a una cifra, y en otros se admite una letra como último carácter. La letra equis es la más frecuente en ese papel, y su aparición no indica ningún error: es una salida prevista por la propia regla.
¿Por qué algunos algoritmos detectan números transpuestos?
Cuando dos caracteres contiguos se intercambian por accidente, la suma ponderada cambia siempre que las dos ponderaciones asociadas a esas posiciones sean distintas entre sí. Si las ponderaciones de posiciones vecinas coinciden, el intercambio deja la suma intacta y el dígito verificador sigue cuadrando: el error pasa sin ser detectado.
Ese razonamiento explica por qué los esquemas que quieren proteger a sus usuarios frente a los dedos rápidos eligen ponderaciones alternas, en las que dos posiciones contiguas casi nunca comparten peso. El precio es que la comprobación se vuelve un poco más laboriosa de describir, porque la ponderación ya no depende solo de la posición absoluta.
Ninguna de estas reglas garantiza detectar todos los errores posibles. La comprobación es una red de seguridad con agujeros conocidos, y su valor está en la clase de fallo que cubre, no en una promesa de infalibilidad.
Cómo elegir un algoritmo para un identificador nuevo
Si hay que diseñar un esquema de numeración nuevo, las preguntas se ordenan casi solas. Primero, qué errores se quieren atrapar: los cambios de un solo carácter y las transposiciones contiguas son los dos accidentes más frecuentes al copiar a mano. Segundo, cuánto espacio se está dispuesto a gastar en el propio control, porque cada carácter reservado es un carácter que no identifica a nadie.
Después llega la decisión menos glamurosa y la más importante: si el esquema debe ser compatible con alguno de los estándares internacionales ya existentes. Elegir un miembro conocido de la familia significa que otras herramientas podrán comprobarlo sin leer un documento nuevo, y ese ahorro de esfuerzo suele pesar más que cualquier ventaja teórica de una fórmula propia.
Por último, conviene comprobar que el resto tiene una traducción limpia en el alfabeto elegido. Nada estropea más un esquema que un residuo que no se puede representar y una regla especial añadida de última hora para taparlo.
Para quien programa: una familia, varias implementaciones
El parentesco de la familia se traduce en una arquitectura cómoda: una sola rutina de cálculo y una tabla de parámetros por esquema.
- Guarda las ponderaciones, el módulo y la traducción como datos, no como ramas condicionales dentro de la función.
- Empieza a ponderar siempre desde un extremo declarado explícitamente y documenta cuál es, porque el error clásico es cambiarlo de lado al portar el código.
- Devuelve el carácter calculado, no la conclusión; deja que la capa de arriba decida cómo llamar al resultado.
- Prueba con cadenas de ceros repetidos y con anchos distintos: son los casos que revelan una ponderación mal alineada.
- Registra el nombre del esquema junto al resultado, para que un cambio de regla se pueda rastrear más adelante.
Si antes de esto conviene recordar cómo encajan las capas de una comprobación, la guía sobre cómo funciona la validación de números ordena el panorama completo.
Siguientes pasos
Toma dos esquemas que ya conozcas y escribe sus parámetros en una tabla de tres columnas: ponderaciones, módulo y traducción del resto. Es muy probable que descubras que solo se diferencian en una de las tres, y esa observación simplifica el código que tengas que escribir después.
Después, pasa por el validador de números un ejemplo inventado de cada tipo y compara las conclusiones, fijándote en si el resultado es válido, no válido o solo formato.
Sobre los ejemplos de este texto: todas las cadenas mencionadas son demostraciones construidas a mano para ilustrar la mecánica de la familia, no pertenecen a ninguna entidad real y no deben interpretarse como números utilizables ni como prueba de autenticidad de nada.