Algoritmos de dígito verificador são parentes próximos: quase todos seguem o mesmo esqueleto — multiplicar cada posição por um peso, somar os resultados, dividir por um módulo e converter o resto em um caractere final. O que muda de um membro para outro são os pesos, o tamanho do módulo e a maneira de representar o resto. Conhecer a família inteira ajuda a escolher a conta certa para cada tipo de número e a perceber quando dois esquemas usam, no fundo, a mesma ideia.
Quantas famílias de algoritmos de dígito verificador existem?
Na prática, três agrupamentos cobrem a maior parte dos números que aparecem em documentos, contas e produtos. O primeiro é o grupo mod-10, em que a soma é reduzida a um múltiplo de dez e o dígito final é o complemento que falta para fechar a dezena; uma variação conhecida desse grupo dobra posições alternadas antes de somar. O segundo é o grupo mod-11, que usa um módulo primo maior e, por isso, produz mais restos distintos — com a consequência de que o resto ocasionalmente precisa de um símbolo extra além dos algarismos. O terceiro é o grupo mod-97, escolhido quando a sequência é longa ou mistura letras e números.
Vale situar os nomes. A série ISO 7064 reúne padrões internacionais de dígito verificador, e uma de suas variantes, a MOD 97-10, é a que sustenta a verificação de IBAN. Outros padrões internacionais descrevem numeração longa e também recorrem a módulos grandes.
| Grupo | Traço que o distingue | Onde costuma aparecer |
|---|---|---|
| mod-10 | Soma reduzida à dezena e complemento como dígito final | Números numéricos de comprimento moderado |
| mod-11 | Módulo primo maior, com mais restos distintos | Esquemas que admitem algarismos e, às vezes, uma letra |
| mod-97 | Módulo grande, adequado a sequências longas | Padrões internacionais de numeração extensa |
O que muda entre mod-10, mod-11 e mod-97
No grupo mod-10, o dígito verificador é o valor que falta para a soma alcançar a próxima dezena cheia. É o mais simples de calcular à mão e o mais fácil de explicar a quem nunca viu o assunto. A variação com dobra de posições alternadas pertence ao mesmo grupo e aparece em muitos esquemas; as regras específicas dela são assunto do texto sobre algoritmo de Luhn, e aqui basta registrá-la como um membro da família.
O grupo mod-11 troca a dezena por um número primo. Como o resto da divisão passa a ter mais valores possíveis, a conta distingue melhor sequências parecidas e captura alguns erros que o mod-10 deixa passar. O preço é a representação: se o resto calculado não couber em um algarismo, o esquema precisa dizer o que fazer. Algumas variantes simplesmente descartam o resultado e recomeçam com outro peso; outras definem um símbolo adicional, como a letra X, para o caso de resto igual a dez.
O mod-97 trabalha com um módulo muito maior, o que faz sentido quando a sequência tem dezenas de caracteres. Um módulo pequeno em uma sequência longa concentraria todo o poder de detecção em poucos valores de resto. O mod-97 é típico de números alfanuméricos, em que as letras precisam ser convertidas em algarismos antes da conta — e é essa conversão que dá margem a erros de implementação, porque cada padrão define a sua própria regra de conversão.
Peso e módulo: os parâmetros que variam dentro da família
Dois parâmetros explicam quase toda a diferença de comportamento entre membros da mesma família.
O primeiro é o conjunto de pesos. Pesos simétricos repetem o mesmo valor em posições espelhadas; pesos assimétricos crescem ou alternam de forma que posições diferentes contribuam de forma diferente. O segundo é o módulo: quanto maior, mais restos distintos existem e mais fino fica o crivo.
| Parâmetro | Efeito prático | Cuidado correspondente |
|---|---|---|
| Pesos | Determinam quais posições pesam mais na soma | Pesos simétricos deixam passar trocas de posição |
| Módulo | Define quantos restos diferentes a conta distingue | Módulo grande exige regra para resto que não cabe em um dígito |
| Mapa do resto | Diz como o resto vira o caractere final | Cada padrão tem o seu, e eles não são intercambiáveis |
O mapa do resto é o parâmetro mais subestimado. Dois esquemas podem usar o mesmo módulo e os mesmos pesos e ainda assim discordar sobre o caractere final, porque um deles usa o resto direto e o outro usa o complemento em relação ao módulo. Trocar esse detalhe inverte o resultado sem que nada mais pareça errado — motivo suficiente para nunca transcrever uma conta de memória.
Por que alguns algoritmos pegam troca de posição?
Trocar dois caracteres vizinhos de lugar é um dos erros mais frequentes de digitação, e a resposta do algoritmo depende inteiramente dos pesos.
Quando duas posições vizinhas têm o mesmo peso, trocar os valores entre elas não altera a soma: os dois produtos são os mesmos, apenas em ordem diferente. A conta fecha, o dígito verificador continua válido e o erro passa despercebido. Por isso pesos simétricos, embora simples, são frágeis justamente para o erro mais provável.
Com pesos assimétricos, cada posição contribui com uma parcela diferente, e a troca muda a soma. Na maioria dos casos a diferença não é múltipla do módulo, e o resultado deixa de fechar. Isso explica por que tantos esquemas adotam pesos que crescem ou alternam de forma desigual, e por que a dobra de posições alternadas, embora pertença ao grupo mod-10, captura boa parte das trocas.
Vale registrar o limite: nenhum peso cobre todas as trocas possíveis, e nenhuma conta cobre todos os erros. Um par de posições cuja diferença de valores coincida com um múltiplo do módulo continua invisível. O dígito verificador reduz muito a chance de erro silencioso, mas não a elimina.
Quatro perguntas antes de escolher um algoritmo
Antes de escolher ou implementar uma conta, quatro perguntas resolvem a maior parte das dúvidas:
- Qual é o comprimento típico do número? Sequências curtas se dão bem com módulos pequenos; sequências longas pedem módulos maiores.
- O conjunto é só de algarismos ou inclui letras? Números alfanuméricos exigem uma etapa de conversão antes da conta.
- De onde vêm os erros? Digitação humana favorece algoritmos com pesos assimétricos; geração automática erra de outras formas.
- Como representar um resultado que não caiba em um algarismo? A resposta precisa estar definida antes de escrever a primeira linha da rotina.
Para quem desenvolve: uma família, uma implementação
Como os membros da família compartilham o esqueleto, faz sentido implementar a conta uma única vez, recebendo pesos, módulo e mapa do resto como parâmetros. Isso reduz a duplicação e torna visível o que diferencia cada esquema.
O passo seguinte é a autoconferência. Cada padrão publicado traz exemplos oficiais; rodar a rotina contra esses exemplos é a única forma barata de saber que a implementação está correta. Nunca invente regras para preencher lacunas: se o padrão não descreve um caso, o comportamento seguro é declarar que o número não pode ser conferido, e não improvisar uma resposta.
Por fim, trate os parâmetros como dados versionados. Quando um esquema muda de peso ou de módulo, a alteração vira um novo conjunto de parâmetros, e decisões antigas continuam reproduzíveis. Os números citados neste texto servem apenas para explicar como a família funciona: são valores de demonstração, não exemplos emitidos por nenhum esquema, e nada aqui permite concluir que um número qualquer esteja registrado ou possa ser usado.
Próximos passos
Se o seu interesse é um número alfanumérico longo, o texto sobre estrutura de IBAN mostra como o mod-97 se aplica a ele. Para começar pelo panorama, a leitura sobre validação de número explica as camadas que vêm antes da conta. E se você só quer ver o resultado para uma entrada específica, cole o número na ferramenta de validação de número e confira quais esquemas ela aponta.