0
0

Java の UUID は符号付きで大小比較される

Posted at

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で)判定される模様です。

reference

java.util.UUID

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0