Существует ли произносимая кодировка? - PullRequest
11 голосов
/ 30 октября 2009

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

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

Ответы [ 8 ]

12 голосов
/ 30 октября 2009

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

6 голосов
/ 30 октября 2009

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

xesef-disof-gytuf-katof-movif-baxux
3 голосов
/ 31 октября 2009

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

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

3 голосов
/ 30 октября 2009

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

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

1 голос
/ 21 октября 2011

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

1 голос
/ 30 октября 2009

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

0 голосов
/ 30 октября 2009

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

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

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

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

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

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

0 голосов
/ 30 октября 2009

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

...