【发布时间】:2017-06-14 08:27:50
【问题描述】:
我创建了两个java.util.UUID 实例,如下所示。一个是从UUID.randomUUID() 创建的,另一个是相同的,但在开头添加了一些额外的数字。当使用UUID.equals 方法比较它们时,它返回true:
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.fromString("12345"+uuid1.toString());
System.out.println(uuid1.equals(uuid2)); // this gives true.
我认为添加的数字被丢弃并且都给出相同的 UUID 字符串值。为什么会这样?
【问题讨论】:
-
UUID 代表一个 128 位的值。肯定 "12345"+uuid1.toString() 超过了该容量,并在内部被 UUID.fromString(..) 方法截断。您可以尝试打印 uuid1.toString() 和 uuid2.toString 并使用较小的 uuid1 进行测试。
-
查看 `UUID.fromString()' 的源代码,您添加的额外部分包含在 UUID 的第一个组件中(即第一个“-”之前的部分)。然后它被移到左边,还有很多其他的东西,所以原来的字符串被使用了。看看源代码就明白我的意思了
-
他们为什么相等是可以理解的。真正的问题是为什么未验证 stringUUID.split("-") 的部分大小。但正如有人在这里stackoverflow.com/a/9771512/3020903 所说的那样,这可能是一个设计决策,除了这段代码的实现者之外没有其他人知道。
-
谢谢@jr593
-
谢谢@Tarmo