Java中UUID的比较是否违反RFC 4122标准?
UUID比较的RFC标准与Java实现冲突
根据UUID标准RFC 4122,UUID应被视为无符号128位整数,比较规则如下:
Lexical Equivalence规则:
将UUID的每个字段视为无符号整数(参考4.1.2节的表格)。比较两个UUID时,按字段的重要性顺序和数据类型逐字段进行算术比较。当且仅当所有对应字段都相等时,两个UUID才相等。
字典序规则:
本定义中的UUID也支持字典序排序。对于两个UUID,若二者首个不同的最高有效字段中,第一个UUID的字段值更大,则第一个UUID排在后面;若第二个UUID的该字段值更大,则第二个UUID排在后面。
按此规则,以下代码的输出应为false,但实际运行结果却是true:
println(UUID.fromString("b533260f-6479-4014-a007-818481bd98c6") < UUID.fromString("131f0ada-6b6a-4e75-a6a0-4149958664e3"))
查看Temurin中UUID类的compareTo实现:
@Override public int compareTo(UUID val) { // The ordering is intentionally set up so that the UUIDs // can simply be numerically compared as two numbers int mostSigBits = Long.compare(this.mostSigBits, val.mostSigBits); return mostSigBits != 0 ? mostSigBits : Long.compare(this.leastSigBits, val.leastSigBits); }
在这个案例中,两个UUID的最高有效位数值分别为:
-5389922481480318956 1377831944219938421
显然,由于Java中long是有符号64位整数,这里出现了溢出问题,导致比较结果不符合RFC标准的要求。
内容的提问来源于stack exchange,提问作者Gabriel Furstenheim
相关产品推荐
相关产品推荐

