Pregunta

Estoy usando UUID, pero no son particularmente agradables de leer, escribir y comunicar. Entonces me gustaría codificarlos. Podría usar base64 o base32, pero de todos modos no serían fáciles: base64 tiene letras y símbolos en mayúscula. Base32 es un poco mejor, pero aún puede obtener cosas torpes.

Me preguntaba si hay una manera agradable y limpia de codificar un número en fonemas agradables, para lograr una mejor legibilidad y, con suerte, un poco de compresión.

¿Fue útil?

Solución

Bubble Babble es una buena opción para probar. Genera resultados sin sentido pero legibles como:

xesef-disof-gytuf-katof-movif-baxux

Otros consejos

Espero que no uses esta idea: El generador de maldición automatizado :)

¿Por qué no usar algo similar a lo que PGP hace para crear claves legibles, simplemente encuentre una buena lista de palabras que sean distintivas, digamos que está usando UUID de 128 bits, una lista de 256 palabras (2 ^ 8) significa 16 palabras.

Pregunta estúpida, pero ¿por qué las personas leen / escriben UUID's / etc. con respecto a su solicitud?

Si todo lo que desea es una manera de comunicar los valores hexadecimales de manera legible (es decir, por teléfono o al indicarle a alguien verbalmente qué escribir), le sugiero que use uno de los distintos alfabetos fonéticos, como Alfabeto fonético de la OTAN o el Alfabeto fonético del Ejército de EE. UU. / Marina .

En este último, las letras AF se pronuncian como "capaz", "panadero", "charlie", "perro", "fácil" y "zorro", respectivamente, por lo que leería la secuencia hexadecimal '' 3fd2cc0e '' como "tres perros zorro dos charlie charlie zero easy". Un líquido se leería exactamente de la misma manera.

S / KEY utiliza un diccionario de 2048 palabras para asignar números de 64 bits a una secuencia de 6 palabras / sílabas predefinidas . (Las personas siempre encontrarán malas palabras si las están buscando;))

Bubble babble y base32 son ineficientes, especialmente en su caso. Sugiero que hagas tu propio algoritmo. Como hay 20 consonantes y 6 vocales (incluyendo 'y') puede tener aprox. 20 * 6 * 2 + 6 * 6 = 276 pares de consonantes / vocales-vocales / consonantes. Entonces cada byte de su número puede ser representado por un par. Con un poco de ajuste, su algoritmo podría producir palabras pronunciables mucho más cortas que el balbuceo de burbujas. Incluso podría jugar a los dados y reemplazar todos los dígitos impares con una consonante / vocal. Por ejemplo, 0123456789ABCDEF (hexadecimal) codifica a ABECIDOFUGYHKRM. 3141592654 (dec) codifica para HHIA-ROIR. Te quedan diez consonantes de repuesto que se pueden combinar con vocales para reemplazar algunas consonantes dobles, etc.

  
    

y con suerte un poco de compresión

  

No estoy seguro exactamente a qué te refieres allí; hacer algo "legible" o "pronouncable" inevitablemente expandirá el espacio requerido para ello. ¿Quizás quisiste decir "ojalá un poco de redundancia"? Sería bueno si, incluso si el usuario comete un pequeño error, el sistema puede detectarlo y quizás incluso corregirlo.

Realmente depende mucho de qué tan grandes sean sus UUID y cómo se comuniquen con mayor frecuencia. Si necesitan comunicarse por teléfono o VoIP, desea una redundancia más audible. Si deben ingresarse en dispositivos móviles con teclados numéricos, es difícil ingresar caracteres alfabéticos, más aún si distinguen entre mayúsculas y minúsculas. Si se escriben mucho, debe preocuparse por los caracteres que se parecen (O y 0 y o, por ejemplo). Si necesitan ser memorizados, entonces probablemente las cadenas de palabras reales sean las mejores (eche un vistazo a PGP Word Lista ).

Sin embargo, creo que una gran solución integral es usar dígitos numéricos. Son mucho más difíciles de confundir entre sí (tanto cuando se hablan como cuando se escriben) que algunos caracteres alfabéticos. Fácil de ingresar en dispositivos móviles, y las personas no son tan malas para memorizar números.

Y la longitud de la cadena tampoco es tan mala. Comparemos base32 con base 10 (decimal). La longitud de una cadena decimal es log_10 (32) veces la longitud de la cadena base32 correspondiente, o aproximadamente 1,5 veces más larga. Diez caracteres de base32 corresponden a 15 dígitos decimales.

No es una gran penalización, en mi opinión, ya que en la base 32 es fácil confundir C y T, o S, F y X (cuando se habla), y es más probable que alguien que habla con acento extranjero cause problemas.

Si fueran fáciles de leer, probablemente no serían particularmente únicos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top