第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该怎么获取?