Вопрос

Я использую UUID, но их не особенно приятно читать, писать и общаться. Поэтому я хотел бы закодировать их. Я мог бы использовать base64 или base32, но все равно это было бы непросто: base64 содержит заглавные буквы и символы. Base32 немного лучше, но вы все равно можете получить неуклюжий материал.

Мне было интересно, есть ли хороший и чистый способ кодировать число в приемлемые фонемы, чтобы добиться лучшей читаемости и, возможно, небольшого сжатия.

Это было полезно?

Решение

Bubble Babble - это хорошая попытка. Он генерирует бессмысленные, но читабельные выходные данные, такие как:

xesef-disof-gytuf-katof-movif-baxux

Другие советы

Я надеюсь, что вы не используете эту идею: Автоматический генератор проклятий :)

Почему бы не использовать нечто похожее на то, что PGP делает для создания читаемых ключей, просто найдите хороший список отличительных слов, скажем, вы используете 128-битные UUID, список из 256 слов (2 ^ 8) означает 16 слова.

Глупый вопрос, но почему люди читают / пишут UUID / etc. в отношении вашего заявления?

Если вам нужен только способ чтения шестнадцатеричных значений (т. е. по телефону или когда кто-то устно указывает, что печатать), то я предлагаю вам использовать один из различных фонетических алфавитов, например Фонетический алфавит НАТО или Фонетический алфавит армии США / ВМФ .

В последнем случае буквы AF произносятся как «способные», «пекарь», «чарли», «собака», «легкий» и «лиса» соответственно, так что вы читаете шестнадцатеричная последовательность «3fd2cc0e»; как "три лиса собаки два чарли ноль лёгкие". Uuid будет считываться точно так же.

S / KEY использует словарь из 2048 слов для сопоставления 64-битных чисел с последовательность из 6 предопределенных слов / слогов. (Люди всегда найдут нецензурные слова, если они их ищут;))

Bubble babble и base32 неэффективны, особенно в вашем случае. Я предлагаю вам сделать свой собственный алгоритм. Так как есть 20 согласных и 6 гласных (включая «у»), вы можете иметь ок. 20 * 6 * 2 + 6 * 6 = 276 пар согласная / гласная-гласная / согласная. Таким образом, каждый байт вашего числа может быть представлен парой. Немного подправив ваш алгоритм, вы сможете произносить произносимые слова, которые намного короче, чем пузырьковая болтовня. Вы даже можете сыграть в кости и заменить все нечетные цифры согласной / гласной. Например, 0123456789ABCDEF (hex) кодирует в ABECIDOFUGYHKRM. 3141592654 (dec) кодирует в HHIA-ROIR. У вас осталось десять запасных согласных, которые можно соединить с гласными, чтобы заменить некоторые двойные согласные и т. Д.

  
    

и, надеюсь, немного сжатия

  

Не знаю точно, что вы имеете в виду; сделать что-то «читабельное» или «произнесенный» неизбежно расширит пространство, необходимое для этого. Может быть, вы имели в виду " немного избыточности " ;? Было бы хорошо, если бы, даже если пользователь допустил небольшую ошибку, система может обнаружить и, возможно, даже исправить ее.

На самом деле это очень сильно зависит от того, насколько велики ваши UUID и как они чаще всего передаются. Если они должны быть переданы по телефону или VoIP, вы хотите больше слышимости избыточности. Если их необходимо вводить в мобильные устройства с помощью цифровых клавиатур, бывает трудно вводить буквенные символы, особенно если они чувствительны к регистру. Если они записаны много, вам нужно беспокоиться о символах, которые выглядят одинаково (например, O и 0 и o). Если они должны быть запомнены, то, вероятно, лучше всего использовать строки из реальных слов (посмотрите на PGP Word Список ).

Однако я думаю, что отличное универсальное решение - это просто использование цифровых цифр. Их гораздо сложнее спутать друг с другом (как в устной, так и в письменной форме), чем некоторые алфавитные символы. Легко вводить на мобильных устройствах, и люди не так уж плохо запоминают номера.

И длина строки тоже не так уж плоха. Давайте сравним base32 с основанием 10 (десятичное число). Длина десятичной строки в log_10 (32) умножается на длину соответствующей строки base32 или примерно в 1,5 раза длиннее. Десять символов base32 соответствуют 15 десятичным цифрам.

IMO не так уж много штрафов, так как в базе 32 легко спутать C и T или S, F и X (когда они произносятся), и кто-то, говорящий с иностранным акцентом, с большей вероятностью вызовет проблемы.

Если бы их было легко читать, они, вероятно, не были бы особенно уникальными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top