You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:52:40