11

我正在使用 UUID,但它们的阅读、写作和交流并不是特别好。所以我想对它们进行编码。我可以使用 base64 或 base32,但无论如何它们都不容易:base64 有大写字母和符号。Base32 好一点,但你仍然可以获得笨拙的东西。

我想知道是否有一种很好且干净的方法可以将数字编码为可口的音素,以便获得更好的可读性并希望有一点压缩。

4

10 回答 10

12

我希望你不要使用这个想法:自动诅咒生成器:)

于 2009-10-30T05:55:21.473 回答
10

Bubble Babble是一个很好的尝试。它会生成无意义但可读的输出,例如:

xesef-disof-gytuf-katof-movif-baxux
于 2009-10-30T06:02:52.917 回答
4

为什么不使用类似于 PGP 的方法来创建可读密钥,只需找到一个很好的独特单词列表,假设您使用的是 128 位 UUID,256 个单词(2^8)的列表意味着 16 个单词。

愚蠢的问题,但为什么人们读/写 UUID/等。关于您的申请?

于 2009-10-30T05:58:52.837 回答
4

这个问题很老了;有趣的是,与我将要介绍的解决方案一样古老,但这里还没有提到。

普朗昆特。在我看来,与 Bubble Babble 类似,但差异使结果更易于阅读。

以下是它的工作原理,来自他们的文档

总之,我们建议将 16 位字符串编码为交替辅音和元音的 proquint [PRO-nouncable QUINT-uplet],如下所示。

四位作为辅音:

0 1 2 3 4 5 6 7 8 9 A B C D E F
b d f g h j k l m n p r s t v z

两位元音:

0 1 2 3
a i o u

整个 16 位单词,其中 "con" = 辅音,"vo" = 元音:

 0 1 2 3 4 5 6 7 8 9 A B C D E F
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|con    |vo |con    |vo |con    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

使用破折号分隔 proquints,它可以不发音或发音为“eh”。proquints 序列的建议可选幻数前缀是“0q-”。

以下是一些 IP 点四边形及其对应的 proquints。

127.0.0.1       lusab-babad
63.84.220.193   gutih-tugad
63.118.7.35     gutuk-bisog
140.98.193.141  mudof-sakat
64.255.6.200    haguz-biram
128.30.52.45    mabiv-gibot
147.67.119.2    natag-lisaf
212.58.253.68   tibup-zujah
216.35.68.215   tobog-higil
216.68.232.21   todah-vobij
198.81.129.136  sinid-makam
12.110.110.204  budov-kuras
于 2020-04-29T07:52:13.933 回答
3

如果您想要的只是一种以可读的方式传达十六进制值的方式(即,通过电话,或者在口头指示某人输入什么时),那么我建议您使用各种拼音字母中的一种,例如北约拼音字母美国陆军/海军音标

在后者中,字母 AF 的发音分别为“able”、“baker”、“charlie”、“dog”、“easy”和“fox”,因此您可以将十六进制序列“3fd2cc0e”读作“三个狐狸狗二查理查理零轻松”。uuid 将以完全相同的方式被读出。

于 2009-10-31T08:24:18.373 回答
2

Bubble babble 和 base32 效率低下,尤其是在您的情况下。我建议你制作自己的算法。由于有 20 个辅音和 6 个元音(包括 'y'),你可以有大约。20*6*2+6*6=276 个辅音/元音-元音/辅音对。所以你的数字的每个字节都可以用一对来表示。通过一些调整,你的算法可以产生比气泡语短得多的发音词。您甚至可以掷骰子并用辅音/元音替换所有奇数数字。例如,0123456789ABCDEF(十六进制)编码为 ABECIDOFUGYHKRM。3141592654 (dec) 编码为 HHIA-ROIR。你剩下十个备用辅音,可以与元音配对以代替一些双辅音等。

于 2011-10-20T21:28:39.863 回答
1

S/KEY使用 2048 个单词的字典将 64 位数字映射到 6 个预定义单词/音节的序列。(人们总是会找到脏话,如果他们正在寻找它们;))

于 2009-10-30T07:07:10.390 回答
1

Urbit 的语音命名系统尚未被提及。它使用 3 个字符代表 8 位,6 个字符代表 16 位,因此它的效率低于 Proquint 或 Bubble Babble,但更可分割。

于 2021-10-15T03:53:20.417 回答
0

并希望有点压缩

不确定你的意思是什么;使某些东西“可读”或“发音”将不可避免地扩大它所需的空间。也许您的意思是“希望有点冗余”?如果即使用户犯了一个小错误,系统也可以检测到甚至纠正它,那就太好了。

实际上,这在很大程度上取决于您的 UUID 有多大以及它们最常通信的方式。如果他们需要通过电话或 VoIP 进行通信,您需要更多可听的冗余。如果需要将它们输入到带有数字键盘的移动设备中,输入字母字符往往会很困难,如果它们区分大小写则更是如此。如果它们写得很多,您需要担心看起来相似的字符(例如 O 和 0 和 o)。如果需要记住它们,那么可能是真正的单词串是最好的(看看PGP Word List)。

但是我认为一个很好的全方位解决方案就是使用数字。它们比一些字母字符更难相互混淆(无论是口语还是书面)。易于在移动设备上输入,而且人们在记忆数字方面也不错。

而且字符串的长度也不算太差。让我们比较 base32 和 base 10(十进制)。十进制字符串log_10(32)的长度是相应 base32 字符串长度的倍数,大约是 1.5 倍。base32 的 10 个字符对应 15 个十进制数字。

没有太大的惩罚,国际海事组织,看到在 32 基数中,很容易混淆 C 和 T,或 S、F 和 X(说话时),而且说外国口音的人更有可能造成麻烦。

于 2009-10-30T06:39:10.190 回答
-3

如果它们易于阅读,它们可能不会特别独特。

于 2009-10-30T05:53:36.407 回答