Skip to content

Commit 4998a7e

Browse files
committed
feat: parameterized length for CUID version 2
Resolves: #4 Signed-off-by: Thibault Meyer <meyer.thibault@gmail.com>
1 parent 4cf240b commit 4998a7e

4 files changed

Lines changed: 46 additions & 19 deletions

File tree

src/main/java/io/github/thibaultmeyer/cuid/CUID.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,18 @@ public static CUID randomCUID2() {
5050
return randomCUID2(CUIDv2.LENGTH_STANDARD);
5151
}
5252

53-
/**
54-
* Generates a new random CUID (Version 2).
55-
*
56-
* @param withBigLength {@code true} to generate a long CUID (Version 2), otherwise, {@code false}
57-
* @return Newly generated CUID (Version 2)
58-
* @since 2.0.0
59-
*/
60-
public static CUID randomCUID2(final boolean withBigLength) {
61-
62-
return randomCUID2(withBigLength ? CUIDv2.LENGTH_BIG : CUIDv2.LENGTH_STANDARD);
63-
}
64-
6553
/**
6654
* Generates a new random CUID (Version 2).
6755
*
6856
* @param length requested CUID length
6957
* @return Newly generated CUID (Version 2)
70-
* @since 2.0.0
58+
* @since 2.0.1
7159
*/
72-
private static CUID randomCUID2(final int length) {
60+
public static CUID randomCUID2(final int length) {
61+
62+
if (length <= 0) {
63+
throw new CUIDGenerationException("the length must be at least 1");
64+
}
7365

7466
final String time = Long.toString(System.currentTimeMillis(), NUMBER_BASE);
7567
final char firstLetter = CUIDv2.ALPHABET_ARRAY[Math.abs(Common.nextIntValue()) % CUIDv2.ALPHABET_ARRAY.length];
@@ -123,7 +115,7 @@ public static boolean isValid(final String cuidAsString) {
123115

124116
return cuidAsString != null
125117
&& (cuidAsString.length() == CUIDv1.LENGTH_STANDARD && cuidAsString.startsWith(CUIDv1.START_CHARACTER) // Version 1
126-
|| (cuidAsString.length() == CUIDv2.LENGTH_STANDARD || cuidAsString.length() == CUIDv2.LENGTH_BIG)) // Version 2
118+
|| (cuidAsString.length() > 0)) // Version 2
127119
&& cuidAsString.chars()
128120
.filter(c -> !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')))
129121
.count() == 0;
@@ -247,7 +239,6 @@ private static final class CUIDv2 {
247239

248240
// CUID configuration
249241
private static final int LENGTH_STANDARD = 24;
250-
private static final int LENGTH_BIG = 32;
251242

252243
// Counter
253244
private static int counter = Integer.MAX_VALUE;

src/main/java/io/github/thibaultmeyer/cuid/exception/CUIDGenerationException.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,15 @@ public CUIDGenerationException(final Throwable cause) {
1717

1818
super("CUID generation failure", cause);
1919
}
20+
21+
/**
22+
* Creates a new instance.
23+
*
24+
* @param cause Cause of the exception
25+
* @since 2.0.1
26+
*/
27+
public CUIDGenerationException(final String cause) {
28+
29+
super("CUID generation failure: " + cause);
30+
}
2031
}

src/test/java/io/github/thibaultmeyer/cuid/CUIDv2Test.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.thibaultmeyer.cuid;
22

3+
import io.github.thibaultmeyer.cuid.exception.CUIDGenerationException;
34
import org.junit.jupiter.api.Assertions;
45
import org.junit.jupiter.api.MethodOrderer;
56
import org.junit.jupiter.api.Test;
@@ -57,7 +58,7 @@ void randomCUIDv2() {
5758
void randomCUIDv2BigLength() {
5859

5960
// Act
60-
final CUID cuid = CUID.randomCUID2(true);
61+
final CUID cuid = CUID.randomCUID2(32);
6162

6263
// Assert
6364
Assertions.assertNotNull(cuid);
@@ -105,6 +106,30 @@ void compareToSame() {
105106
Assertions.assertEquals(0, result);
106107
}
107108

109+
@Test
110+
void parameterizedLength() {
111+
112+
// Act
113+
final CUID cuid = CUID.randomCUID2(2);
114+
115+
// Assert
116+
Assertions.assertNotNull(cuid);
117+
Assertions.assertEquals(2, cuid.toString().length());
118+
}
119+
120+
@Test
121+
void parameterizedLengthInvalidSize() {
122+
123+
// Act
124+
final CUIDGenerationException exception = Assertions.assertThrows(
125+
CUIDGenerationException.class,
126+
() -> CUID.randomCUID2(-1));
127+
128+
// Assert
129+
Assertions.assertNotNull(exception);
130+
Assertions.assertEquals("CUID generation failure: the length must be at least 1", exception.getMessage());
131+
}
132+
108133
@Test
109134
void unicityOver500000() {
110135

src/test/java/io/github/thibaultmeyer/cuid/PerformanceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ void speedCUIDv2Standard() {
7474
@Test
7575
void speedCUIDv2Big() {
7676
for (int i = 0; i < 10; i += 1) {
77-
CUID.randomCUID2(true);
77+
CUID.randomCUID2(32);
7878
}
7979

8080
final List<CUID> cuidList = new ArrayList<>();
8181
final long start = System.nanoTime();
8282
for (int i = 0; i < 1_000_000; i += 1) {
83-
cuidList.add(CUID.randomCUID2(true));
83+
cuidList.add(CUID.randomCUID2(32));
8484
}
8585
final long end = System.nanoTime();
8686

0 commit comments

Comments
 (0)