为什么 UUID#compareTo 与 RFC 4122 不兼容?

Ped*_*ges 3 java comparison uuid

概述

JavasUUID类实现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())));
Run Code Online (Sandbox Code Playgroud)

细节

我的主要问题是,几乎所有其他工具和语言似乎都与RFC 4122一致且兼容,但 Java 不是。

在我的特定情况下,我使用postgresql 13并按包含 UUID 的列进行排序,例如myColumnd::UUIDmyColumnd::text(使用uuid_v4),但由此获得的顺序与使用 Java 获得的顺序不同。

kof*_*ann 8

好吧,在一种情况下,您比较 UUID,在另一种情况下,您比较两个按词汇顺序排列的字符串。

根据 Javadoc:

如果 UUID 不同的最重要字段大于第一个 UUID,则两个 UUID 中的第一个大于第二个。

  • DB通常将UUID视为字符串,但是UUID不是字符串,但可以表示为字符串。 (2认同)
  • 说实话,我们在db中使用as uuid as pk。然而我们并不期望它们有任何特定的顺序。 (2认同)