Urbit 的语音命名系统将无符号整数编码为人类可读的字符串。这些无符号整数有时表示它们以大端序编码的字节字符串(尽管该表示无法跟踪前导零,因此如果需要,字节长度必须在带外进行通信)。语音命名方案对这些大端字节进行操作。
语音命名系统有两种变体。对于一般用途,有@q-encoding,它适用于任何长度的值,并且经常用于在 Hoon 代码中或与 Dojo REPL 交互时表示二进制数据。对于 Urbit 点名称,有 @p-encoding,它基于 @q-encoding 但修改了某些情况。
@q-编码:音节对
Urbit 语音名称由 3 个字母的音节组成,分为两个列表,每个列表包含 256 个音节。每个音节由一个辅音、一个元音和另一个辅音组成。 “前缀”音节列表使用元音a、i和o,“后缀”音节列表使用元音e、u和y,但有一个例外:@ 987654334@,后缀列表中的第一个条目。完整的音节列表如下。
适合一个字节的值,从0x00 到0xFF,通过从后缀列表中获取相应的音节进行编码。示例:0x00 变为 ~zod,0x01 变为 ~nec。
从0x0100到0xFFFF的两个字节中的值是通过查找前缀列表中的高字节对应的音节并连接后缀列表中的低字节对应的音节来编码的。示例:0x0100 变为 ~marzod,0x0101 变为 ~marnec。
较大的值通过以大端顺序将它们分成两字节对进行编码,按照上述对适合两个字节的值进行编码,并使用-连字符/减号字符连接结果。如果该值为奇数字节,则第一个字节对用前导零填充。示例:0x01_0000 变为 ~doznec-dozzod,0x0101_0101 变为 ~marnec-marnec。
@p-编码:扰乱行星
对于大多数值,@p 编码方案与 @q 相同。但是 17 到 64 位的值不同,对应行星和卫星的 ID。
行星旨在对应于 Urbit 网络上的真实个体。每个行星都是从一颗恒星产生的,行星 ID 的低 16 位是其母星 ID。在@q-编码系统下,这也意味着每个行星名称的最后两个音节将是它的恒星名称。 Urbit 开发人员不希望网络上的每个人的名字都包含最初恰好产生他们的星球的恒星的名称:这会人为地将他们与恒星永远联系起来,即使他们可以立即将他们的星球转移到另一颗恒星.
他们的解决方案是随机打乱所有行星名称,以混淆行星名称与其母星名称之间的关系。这是作为可能的行星 ID 空间上的自定义(显然是不安全的)密码来实现的。因为每颗恒星有 216 - 1 颗行星,行星的数量不是 2 的幂,所以传统的分组密码不能直接工作。相反,他们使用 Ciphers with Arbitrary Finite Domains (Black and Rockway 2002) 中描述的结构,而不是针对速度优化的自定义 Feistel 样式分组密码 (and compatibility)。
这种加扰应用于行星 ID 和卫星 ID 的低 32 位(对应于其父行星的 ID)。在@p-encoding 下,ID 为0x01_0101 的行星变为~ralnyt-botdyt,显示与其母星~marnec 没有任何联系。星-行星关系是唯一被混淆的关系。如果您查看行星卫星的名称,它们直接包含行星的名称:例如,~ralnyt-botdyt 的卫星 0x01_0001_0101 变为 ~doznec-ralnyt-botdyt,0x02_0001_0101 变为 ~dozbud-ralnyt-botdyt。
实现
在编写 Hoon 代码时,例如在 Dojo REPL 中,您可以直接使用标准的 @p 和 @q 函数将值编码为相应的拼音名称。在 Hoon 中,@p 编码值使用前缀 ~ 标识,@q 编码值使用前缀 .~ 标识,两者都可以使用 @u 函数解码回来。 Hoon 还使用. 句点字符作为整数文字中的(强制性)千位分隔符。
> `@p`1.529.729.032
~diglyt-diglyt
> `@q`1.529.729.032
.~fonbyn-mopful
> `@u`~diglyt-diglyt
1.529.729.032
> `@u`.~diglyt-diglyt
3.246.440.832
在 JavaScript 中,the official urbit-ob package 提供了类似的功能。
import ob from "urbit-ob";
ob.patp(1529729032); // ~diglyt-diglyt
ob.patq(1529729032); // ~fonbyn-mopful
ob.patp2dec("~diglyt-diglyt"); // 1529729032
ob.patq2dec("~diglyt-diglyt"); // 3246440832
完整的音节列表
prefixes = ["doz","mar","bin","wan","sam","lit","sig","hid","fid","lis","sog",
"dir","wac","sab","wis","sib","rig","sol","dop","mod","fog","lid","hop","dar",
"dor","lor","hod","fol","rin","tog","sil","mir","hol","pas","lac","rov","liv",
"dal","sat","lib","tab","han","tic","pid","tor","bol","fos","dot","los","dil",
"for","pil","ram","tir","win","tad","bic","dif","roc","wid","bis","das","mid",
"lop","ril","nar","dap","mol","san","loc","nov","sit","nid","tip","sic","rop",
"wit","nat","pan","min","rit","pod","mot","tam","tol","sav","pos","nap","nop",
"som","fin","fon","ban","mor","wor","sip","ron","nor","bot","wic","soc","wat",
"dol","mag","pic","dav","bid","bal","tim","tas","mal","lig","siv","tag","pad",
"sal","div","dac","tan","sid","fab","tar","mon","ran","nis","wol","mis","pal",
"las","dis","map","rab","tob","rol","lat","lon","nod","nav","fig","nom","nib",
"pag","sop","ral","bil","had","doc","rid","moc","pac","rav","rip","fal","tod",
"til","tin","hap","mic","fan","pat","tac","lab","mog","sim","son","pin","lom",
"ric","tap","fir","has","bos","bat","poc","hac","tid","hav","sap","lin","dib",
"hos","dab","bit","bar","rac","par","lod","dos","bor","toc","hil","mac","tom",
"dig","fil","fas","mit","hob","har","mig","hin","rad","mas","hal","rag","lag",
"fad","top","mop","hab","nil","nos","mil","fop","fam","dat","nol","din","hat",
"nac","ris","fot","rib","hoc","nim","lar","fit","wal","rap","sar","nal","mos",
"lan","don","dan","lad","dov","riv","bac","pol","lap","tal","pit","nam","bon",
"ros","ton","fod","pon","sov","noc","sor","lav","mat","mip","fip"]
suffixes = ["zod","nec","bud","wes","sev","per","sut","let","ful","pen","syt",
"dur","wep","ser","wyl","sun","ryp","syx","dyr","nup","heb","peg","lup","dep",
"dys","put","lug","hec","ryt","tyv","syd","nex","lun","mep","lut","sep","pes",
"del","sul","ped","tem","led","tul","met","wen","byn","hex","feb","pyl","dul",
"het","mev","rut","tyl","wyd","tep","bes","dex","sef","wyc","bur","der","nep",
"pur","rys","reb","den","nut","sub","pet","rul","syn","reg","tyd","sup","sem",
"wyn","rec","meg","net","sec","mul","nym","tev","web","sum","mut","nyx","rex",
"teb","fus","hep","ben","mus","wyx","sym","sel","ruc","dec","wex","syr","wet",
"dyl","myn","mes","det","bet","bel","tux","tug","myr","pel","syp","ter","meb",
"set","dut","deg","tex","sur","fel","tud","nux","rux","ren","wyt","nub","med",
"lyt","dus","neb","rum","tyn","seg","lyx","pun","res","red","fun","rev","ref",
"mec","ted","rus","bex","leb","dux","ryn","num","pyx","ryg","ryx","fep","tyr",
"tus","tyc","leg","nem","fer","mer","ten","lus","nus","syl","tec","mex","pub",
"rym","tuc","fyl","lep","deb","ber","mug","hut","tun","byl","sud","pem","dev",
"lur","def","bus","bep","run","mel","pex","dyt","byt","typ","lev","myl","wed",
"duc","fur","fex","nul","luc","len","ner","lex","rup","ned","lec","ryd","lyd",
"fen","wel","nyd","hus","rel","rud","nes","hes","fet","des","ret","dun","ler",
"nyr","seb","hul","ryl","lud","rem","lys","fyn","wer","ryc","sug","nys","nyl",
"lyn","dyn","dem","lux","fed","sed","bec","mun","lyr","tes","mud","nyt","byr",
"sen","weg","fyr","mur","tel","rep","teg","pec","nel","nev","fes"]