1 package com.buralotech.oss.identifier.uuid;
2
3 import com.fasterxml.uuid.Generators;
4 import com.fasterxml.uuid.NoArgGenerator;
5 import com.fasterxml.uuid.UUIDType;
6 import com.fasterxml.uuid.impl.UUIDUtil;
7
8 import java.nio.ByteBuffer;
9 import java.nio.ByteOrder;
10 import java.time.Instant;
11 import java.util.regex.Pattern;
12
13
14
15
16 public class UUIDVersion6Delegate implements UUIDVersionDelegate {
17
18
19
20
21 private static final Pattern PATTERN = Pattern.compile("[0-9a-zA-Z_-]{8}[NOPQ][0-9a-zA-Z_-][159DHLPTXaeimquy][0-9a-zA-Z_-]{10}[FVk-]");
22
23
24
25
26 private final NoArgGenerator generator = Generators.timeBasedReorderedGenerator();
27
28
29
30
31
32
33 @Override
34 public byte[] generate() {
35 final var uuid = generator.generate();
36 return UUIDUtil.asByteArray(uuid);
37 }
38
39
40
41
42
43
44
45 @Override
46 public boolean isValidBinary(final byte[] binary) {
47 return ((binary[6] & 0xf0) >> 4 == 6) && ((binary[8] & 0xc0) >> 6 == 2);
48 }
49
50
51
52
53
54
55
56 @Override
57 public boolean isValidText(final String text) {
58 return PATTERN.matcher(text).matches();
59 }
60
61
62
63
64
65
66
67 @Override
68 public Instant toInstant(final byte[] binary) {
69 return Instant.ofEpochMilli(UUIDUtil.extractTimestamp(UUIDUtil.constructUUID(UUIDType.TIME_BASED_REORDERED, binary)));
70 }
71
72
73
74
75
76
77
78
79 @Override
80 public byte[] fromTicks(final long ticks, final long suffix) {
81 final var bytes = new byte[16];
82 final var buffer = ByteBuffer.wrap(bytes);
83 buffer.order(ByteOrder.BIG_ENDIAN);
84 buffer.putLong(((ticks & 0xFFFFFFFFFFFFF000L) << 4) | 0x06000L | (ticks & 0x0FFFL));
85 buffer.putLong(suffix);
86 return bytes;
87 }
88 }