Pergunta

Estou usando UUIDs, mas eles não são particularmente agradáveis ​​de ler, escrever e comunicar.Então, eu gostaria de codificá-los.Eu poderia usar base64 ou base32, mas não seriam fáceis de qualquer maneira:base64 possui letras e símbolos maiúsculos.Base32 é um pouco melhor, mas você ainda pode obter coisas desajeitadas.

Eu queria saber se existe uma maneira agradável e limpa de codificar um número em fonemas palatáveis, para obter melhor legibilidade e, com sorte, um pouco de compactação.

Foi útil?

Solução

Bolha Balbuciante é uma boa opção para tentar.Ele gera resultados sem sentido, mas legíveis, como:

xesef-disof-gytuf-katof-movif-baxux

Outras dicas

Espero que você não use esta ideia: O Gerador Automatizado de Maldições :)

Por que não usar algo semelhante ao que o PGP faz para criar chaves legíveis, simplesmente encontre uma boa lista de palavras distintas, digamos que você esteja usando UUIDs de 128 bits, uma lista de 256 palavras (2 ^ 8) significa 16 palavras.

Pergunta estúpida, mas por que as pessoas estão lendo/escrevendo UUIDs/etc.em relação à sua aplicação?

Se tudo o que você deseja é uma maneira de comunicar valores hexadecimais de forma legível (ou seja, por telefone ou ao instruir alguém verbalmente o que digitar), sugiro que você use um dos vários alfabetos fonéticos, como o Alfabeto Fonético da OTAN ou o Alfabeto Fonético do Exército/Marinha dos EUA.

Neste último, as letras AF são faladas como "capaz", "padeiro", "charlie", "cachorro", "fácil" e "raposa", respectivamente, então você leria a sequência hexadecimal "3fd2cc0e" como "três fox dog dois charlie charlie zero fácil".Um uuid seria lido exatamente da mesma maneira.

S/TECLA usa um dicionário de 2.048 palavras para mapear números de 64 bits em uma sequência de 6 predefinido palavras/sílabas.(As pessoas sempre encontrarão palavrões se os procurarem;))

Bubble babble e base32 são ineficientes, especialmente no seu caso.Eu sugiro que você crie seu próprio algoritmo.Como existem 20 consoantes e 6 vogais (incluindo 'y'), você pode ter aprox.20*6*2+6*6=276 pares consoante/vogal-vogal/consoante.Portanto, cada byte do seu número pode ser representado por um par.Com alguns ajustes, seu algoritmo pode produzir palavras pronunciáveis ​​muito mais curtas do que o balbucio de bolhas.Você pode até jogar dados e substituir todos os dígitos ímpares por uma consoante/vogal.Por exemplo, 0123456789ABCDEF (hex) codifica para ABECIDOFUGYHKRM.3141592654 (dec) codifica para HHIA-ROIR.Você fica com dez consoantes sobressalentes que podem ser combinadas com vogais para substituir algumas consoantes duplas, etc.

e espero que um pouco de compressão

Não sei exatamente o que você quer dizer com isso;tornar algo “legível” ou “pronunciável” inevitavelmente expandirá o espaço necessário para isso.Talvez você quis dizer "espero que um pouco de redundância"?Seria bom que, mesmo que o usuário cometesse um pequeno erro, o sistema pudesse detectá-lo e talvez até corrigi-lo.

Na verdade, depende muito do tamanho dos seus UUIDs e de como eles são comunicados com mais frequência.Se eles precisarem ser comunicados por telefone ou VoIP, você desejará uma redundância mais audível.Se eles precisarem ser inseridos em dispositivos móveis com teclados numéricos, tende a ser difícil inserir caracteres alfabéticos, ainda mais se eles diferenciam maiúsculas de minúsculas.Se eles são muito escritos, você precisa se preocupar com caracteres parecidos (O e 0 e o, por exemplo).Se precisarem ser memorizadas, então provavelmente sequências de palavras reais são as melhores (dê uma olhada no Lista de palavras PGP).

No entanto, acho que uma ótima solução completa é usar apenas dígitos numéricos.Eles são muito mais difíceis de confundir entre si (tanto quando falados quanto escritos) do que alguns caracteres alfabéticos.Fácil de inserir em dispositivos móveis e as pessoas não são tão ruins em memorizar números.

E o comprimento da corda também não é tão ruim.Vamos comparar a base32 com a base 10 (decimal).O comprimento de uma string decimal é log_10(32) vezes o comprimento da string base32 correspondente ou cerca de 1,5 vezes mais.Dez caracteres de base32 correspondem a 15 dígitos decimais.

Não é uma grande penalidade, IMO, visto que na base 32 é fácil confundir C e T, ou S, F e X (quando falado), e alguém falando com sotaque estrangeiro tem maior probabilidade de causar problemas.

Se fossem fáceis de ler, provavelmente não seriam particularmente únicos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top