我正在使用 UUID,但它们的阅读、写作和交流并不是特别好。所以我想对它们进行编码。我可以使用 base64 或 base32,但无论如何它们都不容易:base64 有大写字母和符号。Base32 好一点,但你仍然可以获得笨拙的东西。
我想知道是否有一种很好且干净的方法可以将数字编码为可口的音素,以便获得更好的可读性并希望有一点压缩。
我希望你不要使用这个想法:自动诅咒生成器:)
Bubble Babble是一个很好的尝试。它会生成无意义但可读的输出,例如:
xesef-disof-gytuf-katof-movif-baxux
为什么不使用类似于 PGP 的方法来创建可读密钥,只需找到一个很好的独特单词列表,假设您使用的是 128 位 UUID,256 个单词(2^8)的列表意味着 16 个单词。
愚蠢的问题,但为什么人们读/写 UUID/等。关于您的申请?
这个问题很老了;有趣的是,与我将要介绍的解决方案一样古老,但这里还没有提到。
是普朗昆特。在我看来,与 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
Bubble babble 和 base32 效率低下,尤其是在您的情况下。我建议你制作自己的算法。由于有 20 个辅音和 6 个元音(包括 'y'),你可以有大约。20*6*2+6*6=276 个辅音/元音-元音/辅音对。所以你的数字的每个字节都可以用一对来表示。通过一些调整,你的算法可以产生比气泡语短得多的发音词。您甚至可以掷骰子并用辅音/元音替换所有奇数数字。例如,0123456789ABCDEF(十六进制)编码为 ABECIDOFUGYHKRM。3141592654 (dec) 编码为 HHIA-ROIR。你剩下十个备用辅音,可以与元音配对以代替一些双辅音等。
Urbit 的语音命名系统尚未被提及。它使用 3 个字符代表 8 位,6 个字符代表 16 位,因此它的效率低于 Proquint 或 Bubble Babble,但更可分割。
并希望有点压缩
不确定你的意思是什么;使某些东西“可读”或“发音”将不可避免地扩大它所需的空间。也许您的意思是“希望有点冗余”?如果即使用户犯了一个小错误,系统也可以检测到甚至纠正它,那就太好了。
实际上,这在很大程度上取决于您的 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(说话时),而且说外国口音的人更有可能造成麻烦。
如果它们易于阅读,它们可能不会特别独特。