123438Y1036D-7527-442A- 98 SA-FF19留下155只熊
这不是UUID。 它是“ 1234”和UUID的串联字符串。 这里的问题是解析器应该通过抛出异常来告诉您这一点。 取而代之的是,它会尽最大努力真正找到埋在其中某个地方的UUID。
从串联字符串中提取UUID后,它与第一个UUID相同,这是您正在观察的正确结果。
我们可以分析解析器(感谢@ tim-biegeleisen提供了链接):
public static UUID fromString(String name) {
String[] components = name.split("-");
if (components.length != 5)
throw new IllegalArgumentException("Invalid UUID string: "+name);
for (int i=0; i<5; i++)
components[i] = "0x"+components[i];
long mostSigBits = Long.decode(components[0]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[1]).longValue();
mostSigBits <<= 16;
mostSigBits |= Long.decode(components[2]).longValue();
long leastSigBits = Long.decode(components[3]).longValue();
leastSigBits <<= 48;
leastSigBits |= Long.decode(components[4]).longValue();
return new UUID(mostSigBits, leastSigBits);
}
我们可以看到,除了计算连字符限制的组数之外,没有其他验证方法。 它只需要这些组,然后将它们移到位置。 您已经在第一组前面添加了额外的字符,这是最重要的部分。 首先对其进行解析和存储,然后再上移一次,直到占据最重要的部分。 现在,所有比假定的还要远的位都被推出long的限制,因此它们被完全忽略。