为何Java的UUID#compareTo方法实现与RFC 4122规范不兼容?
概述
Java的UUID类实现了Comparable接口,但它实现的排序逻辑与RFC 4122给出的规范不兼容。
具体而言,它的排序结果与UUID字符串表示隐含的自然排序(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())));
详情
目前绝大多数其他工具和编程语言的UUID排序逻辑都与RFC 4122规范兼容,只有Java的实现存在差异,这是主要问题。
实际使用中会遇到的问题:使用PostgreSQL 13对存储UUID的列排序,例如myColumnd::UUID或myColumnd::text(使用uuid_v4),得到的排序结果与Java的排序结果不一致。
内容的提问来源于stack exchange,提问作者Pedro Borges
相关产品推荐
相关产品推荐

