概述
Java UUID
类实现 Comparable
.但是它实现的顺序似乎与 RFC 4122 中给出的规范不兼容。 .
特别是,它与其字符串表示( uuid1.toString().compareTo(uuid2.toString())
)所隐含的自然顺序不一致,这与 RFC 一致。
例子
您可以使用以下代码重现并观察问题:
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.randomUUID();
Assert.assertEquals(
Math.signum((int) uuid1.compareTo(uuid2)),
Math.signum((int) uuid1.toString().compareTo(uuid2.toString())));
细节
我的主要问题是几乎所有其他工具和语言似乎都与 RFC 4122 一致并兼容。 ,但 Java 不是。
在我的特殊情况下,我使用 PostgreSQL 13 并按包含 UUID 的列排序,例如
myColumnd::UUID
或 myColumnd::text
(使用 uuid_v4
),但我由此获得的顺序与使用 Java 获得的顺序不同。
最佳答案
好吧,在一种情况下,您比较 UUID,在另一种情况下,按词法顺序比较两个字符串。
根据 Javadoc:
The first of two UUIDs is greater than the second if the most significant field in which the UUIDs differ is greater for the first UUID.
关于java - 为什么 UUID#compareTo 与 RFC 4122 不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69815008/