第120章UUID - Minecraft指令手册 - 你好MC - 游戏竞技小说 - 30读书

第120章UUID

在minecraftjava1.7.10版本更新中,mojang认为正版玩家是可以更改用户名的。但如果玩家可以更改用户名,那么一个用户名就不能代表着一个玩家了,因为这名玩家可以更改他的用户名。解决这个问题的唯一办法,就是给玩家添加一个从按下注册那一键开始就不能改变的识别码,而且两个玩家的识别码不能重复。

mojang想来想去,最终决定使用网络上常用的universallyuniqueidentifier来作为玩家的不可改变识别码,这就是作者在之前经常提到的uuid,它的中文名叫做“通用唯一识别码”(按理说学过java的应该都知道)。

uuid有很多种形态,最常见的形式就是:

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

因为都是用x来表示,所以第一眼是不知道这到底是多少进制的。这其实是uuid的十六进制表示形式。准确的来讲,是“连字符十六进制”形式(string),就是16进制的uuid分割成了8+4+4+4+12的5段,相邻两段用连字符连接上。

当然,把连字符去掉就是纯洁的十六进制形式(stringwithouthyphens)了:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

当然去掉连字符你有很大的可能会抄错,所以还是建议抄uuid之前加上个连字符。

神奇的是,如果你的uuid是这样的:

00000001-0001-0001-0001-000000000001

那么你就不用在乎前面的那么多0了,可以直接省略掉,变成:

1-1-1-1-1

这是一个非常人性化的设计,也非常符合数学。

当然如果是10000001-1001-1001-1001-100000000001这样的,可不要想着缩写成:

11-11-11-11-11

不然代码运行的时候会以为这个uuid是00000011-0011-0011-0011-000000000011的缩写。

而且这仅限有连字符的16位uuid。

现在你知道了这种表现形式的uuid一共有32位(除去连接符),那么问题来了,之前的uuidmost(uuid高位)和uuidleast(uuid低位)到底是啥呢?

在解答之前,作者建议你先去找一个进制转换器,以方便现学现做。

以刚才的00000001-0001-0001-0001-000000000001举例,现在它是16进制。

把前面3段和后面两段分开,并分别划成10进制,变成:4295032833和281474976710657这两个数。

这两个数就是这个uuid的高位以及低位了。其实高位以及低位就是将16进制的uuid切成两半然后划成10进制得出的数,说明白点,就是:

xxxxxxxx-xxxx-xxxx这一段转换成10进制就是uuidmost

xxxx-xxxxxxxxxxxx这一段转换成10进制就是uuidleast

但是别忘记了,如果没有特别指明,你是不知道一个16进制的数字到底是正的还是负的。

原因的话,百度一下,你就知道(毕竟这是minecraft指令教学,不是计算机课)。

所以1.16版本以前的指令都是叫你填uuidmost以及uuidleast,而不是16进制的uuid,虽然在后台的时候是使用16进制的uuid。

你肯定知道(只要你不是跳着看的),在1.16版本更新中,uuid再也不是16进制表现形式,也不是高位以及低位了,而是使用了一个全新的表现方式:整型数组(int-array)

其样式就是之前第八十八章讲json时提到的数组(array)。

比如:[i;-678432868,1549618207,-1367000395,-2137777200]

好像这和1.16版本之前的uuid没有太大关系。

但如果你用过之前作者提供的一个uuid转换器(www.soltoder.com/mc-uuid-converter/),那么你就知道,1.16版本的uuid与之前的uuid是可以转换的,不然正版玩家的uuid就得重新设了。

如果你不想了解的话,你是可以跳过这一段的,去看看uuid到底该如何获取。

但如果你想了解的话,不妨也来看一看。

如果你仔细观察这一串数组,你就会发现这4串数字是有正负号的,并且假设你之前用过那个uuid转换器,并按了那“随机”好多次,估计你就会发现这四串数,0到9都有。

这些证据证明,这四串数,是十进制。

既然是十进制,那就好办了。根据uuidmost以及uuidleast的经验,这四串数,极有可能是16进制的uuid平均分成4段再分别划成十进制的数。

为了验证我们(作者)的猜想,这里作者随机了一个uuid:

16进制——09fa22c0-807d-4a29-b0fa-a6513fab4822

数组形——[i;167387840,-2139272663,-1325750703,1068189730]

将09fa22c0-807d-4a29-b0fa-a6513fab4822的连接符去掉,再平均分成4段,并取最前面的那一段,也就是:

09fa22c0

划成十进制就是:167387840

真相大白!

1.16版本的数组uuid就是将16进制形态的uuid平均分成四段再分别划成十进制最后组合成一个数组!这比那些在网上看见人问就扔一个网址的人好了不知道多少倍!

(哎作者,你不是之前也扔过吗?)

为了满足某些强迫症,这里作者就将下面3份给划成十进制了。

等等,遇到了一个小问题,这个负数问题,该怎么办?

百毒一下,你就知道。

说了这么多uuid,那么uuid该怎么获取?

字体大小
主题切换