UUID を以下のパターンで比較してみます。
format | uuid |
---|---|
基準 | 018cc122-1a9d-7478-06e8-7a96ab18fea0 |
MSB比較 | X18cc122-1a9d-7478-06e8-7a96ab18fea0 |
LSB比較 | 018cc122-1a9d-7478-X6e8-7a96ab18fea0 |
var uuid = UUID.fromString("018cc122-1a9d-7478-06e8-7a96ab18fea0");
var um1 = UUID.fromString("118cc122-1a9d-7478-06e8-7a96ab18fea0");
var um8 = UUID.fromString("818cc122-1a9d-7478-06e8-7a96ab18fea0");
var ul1 = UUID.fromString("018cc122-1a9d-7478-16e8-7a96ab18fea0");
var ul8 = UUID.fromString("018cc122-1a9d-7478-86e8-7a96ab18fea0");
System.out.println(uuid.compareTo(um1));
System.out.println(uuid.compareTo(um8));
System.out.println(uuid.compareTo(ul1));
System.out.println(uuid.compareTo(ul8));
実行結果:
-1
1
-1
1
(Java 18.0.2.1 で確認)
uuid と um1 の比較結果は負数、すなわち uuid < um1 と判定されます。
uuid と um8 の比較結果は正数、すなわち uuid > um8 と判定されます。
同様に
uuid と ul1 の比較結果は負数、すなわち uuid < ul1 と判定されます。
uuid と ul8 の比較結果は正数、すなわち uuid > ul8 と判定されます。
観測結果
UUID 128 bit について、先頭 64 bit と末尾 64 bit をそれぞれ符号付きとして比較される模様です。すなわち先頭の文字が8~Fの場合は負数として比較されるため、0よりも小さいと判定されます。
補足
32bit 境界 (たとえば
018cc122-8a9d-7478-06e8-7a96ab18fea0) は基準となる uuid より大きいと判定されましたので、64 bit 境界で(longで)判定される模様です。