Entendendo caracteres visualmente ambíguos em IDs
- Caracteres visualmente ambíguos são aqueles que são difíceis de distinguir em certas fontes ou na escrita à mão
- O/0, I/l/1/7, 5/S, 2/Z, 8/B, 6/G, 9/q/g etc. se enquadram nisso
- Esses caracteres podem causar erros e confusão na entrada de dados
- Por exemplo, o usuário pode ter dificuldade para diferenciar
O e 0 e acabar digitando um código incorreto, gerando uma experiência ruim
- Isso é especialmente importante em situações em que o ID é transmitido verbalmente ou precisa ser escrito à mão
- atendimento ao cliente, código de desconto, código de rastreamento, ID de erro, ID de produto etc.
Decidindo se diferencia maiúsculas e minúsculas
- É preciso decidir se o ID fará distinção entre letras maiúsculas e minúsculas
- Com distinção entre maiúsculas e minúsculas e excluindo ambiguidades visuais, há 53 caracteres disponíveis
- Sem distinção entre maiúsculas e minúsculas, há 22 caracteres disponíveis
- Se o ID tiver 5 caracteres, a quantidade de IDs possíveis é:
- Com distinção entre maiúsculas e minúsculas: 53^5 = 418,195,493
- Sem distinção entre maiúsculas e minúsculas: 22^5 = 5,153,632
- No entanto, à medida que o comprimento do ID aumenta, o número de IDs possíveis cresce exponencialmente
- Portanto, é preciso encontrar um equilíbrio entre o comprimento do ID e a possibilidade de ambiguidade visual
- Além disso, usar maiúsculas e minúsculas pode causar problemas inesperados em sistemas de terceiros que não diferenciam maiúsculas de minúsculas
Conjunto de caracteres visualmente claros
- Se a prioridade for legibilidade, recomenda-se usar o seguinte conjunto de caracteres:
- [ "a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "w", "x", "y", "3", "4"]
Considerações adicionais
- Certas combinações de caracteres podem parecer outros caracteres (ex.: rn pode parecer m, 3 pode parecer w)
- É melhor evitar essas combinações na etapa de geração do ID
- Também é recomendável evitar caracteres com pronúncia semelhante (ex.: b e p)
- Isso é especialmente importante quando o ID é transmitido verbalmente
Casos existentes
- Crockford's Base32: decodifica caracteres ambíguos como o mesmo valor e também considera palavrões acidentais
- Open Location Code: usa o conjunto de caracteres 23456789CFGHJMPQRVWX. Além de evitar ambiguidade visual, também busca evitar a formação de palavras em idiomas comuns. No entanto, inclui 6/G e 9/Q.
Opinião do GN⁺
- Na geração de IDs, usabilidade e legibilidade devem ser tratadas como prioridade máxima. Isso é ainda mais importante se for frequente que o ID precise ser transmitido verbalmente ou anotado à mão.
- É importante escolher um conjunto de caracteres que minimize a ambiguidade visual, encontrando ao mesmo tempo um equilíbrio adequado entre o comprimento do ID e o número de combinações possíveis.
- Além disso, como podem surgir problemas inesperados ao integrar com sistemas de terceiros, a decisão sobre diferenciar ou não maiúsculas e minúsculas deve ser tomada com cuidado.
- Também são necessárias considerações adicionais, como excluir certas combinações de caracteres na lógica de geração do ID ou evitar caracteres com pronúncia semelhante.
- É recomendável consultar casos como Crockford's Base32 e Open Location Code para projetar o conjunto de caracteres ideal de acordo com os requisitos do projeto.
3 comentários
Isso também parece bom: https://stackoverflow.com/a/58098360/8556340
É realmente impressionante que tenham levado em conta até a pronúncia.
Comentários do Hacker News
Math::Fleximal). O motivo foi alguém ter usado em produção um código de demonstração que convertia hexadecimal em um código alfanumérico.