在Minecraft JAVA 1.7.10版本更新中,Mojang认为玩家可以更改用户名。但如果玩家可以更改用户名,那么一个用户名就不能完全代表一个玩家。解决这个问题的唯一办法,就是给玩家添加一个从按下注册那一键开始就不能改变的唯一识别码。
使用什么样的识别码呢?Mojang直接就采用了不管是在Minecraft中还是在网络上都十分常用的『Universally Unique Identifier』来作为玩家的不可改变识别码,这就是作者在之前经常提到的UUID,它的中文名叫做『通用唯一识别码』。
一个UUID本质上是一个长达128位的随机生成的二进制数字,但我们不可能直接使用它的二进制形式,而是使用它的『十六进制』或『十进制』形式。
在十六进制中,最常见的形式就是:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
这是UUID的『十六进制表示形式』。准确的来讲,是『有连字符的十六进制(Hyphenated hexadecimal)』形式。这种形式的UUID本质上是将UUID转化到十六进制后,再用连字符『-』将其分割成8+4+4+4+12的5段。
当然,把连字符去掉就是纯洁的『十六进制形式(String without hyphens)』了:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
只不过去掉连字符的话,你有很大概率会抄错,所以还是建议在抄UUID之前给它加上个连字符。
什么?你不知道十六进制?
那你总知道十进制吧?在十进制中,数字是逢十进一。比如:
5+5=10
所以对于十六进制来讲,数字就是逢十六进一。比如:
(5+5)+7=a+7=11
其中,字母『a』在十六进制中代表『十』这个数字。以此类推,b代表『十一』、c代表『十二』.......f代表『十五』。
这就是十六进制,你懂了吗?
回到正题。我们在第一百零六章时就已经遇到过『有连字符的十六进制』这种形式的UUID了。你还记得吗?让我们回忆一下:
『/attribute @s minecraft:generic.max_health modifier value get 1-1-1-1-1 2.0』
其中,参数『1-1-1-1-1』就是一个『有连字符的十六进制』形式的UUID。等等,为什么这个UUID不是8+4+4+4+12的?
如果你有注意到游戏返回的消息,就会发现,这种UUID在游戏眼中会被视为:
『00000001-0001-0001-0001-000000000001』
也就是说,UUID中数字前面的0可以被省略。比如:
『00000101-0001-0003-0015-0000000』
上面这串UUID就可以省略成:
『101-1-3-15-』
这是一个非常人性化的设计,也非常符合数学。