Fix increment

Fix UlidSpecCreator.increment()
This commit is contained in:
Fabio Lima 2020-07-06 04:31:17 -03:00
parent 1deb79b52e
commit 3929965fe9
4 changed files with 26 additions and 22 deletions

View File

@ -28,7 +28,7 @@ Add these lines to your `pom.xml`.
<dependency>
<groupId>com.github.f4b6a3</groupId>
<artifactId>ulid-creator</artifactId>
<version>2.0.0</version>
<version>2.0.1</version>
</dependency>
```
See more options in [maven.org](https://search.maven.org/artifact/com.github.f4b6a3/ulid-creator).

View File

@ -47,8 +47,8 @@ public class UlidSpecCreator {
protected long random1 = 0;
protected long random2 = 0;
protected long randomMax2;
protected long randomMax1;
protected long randomMax2;
protected static final long HALF_RANDOM_COMPONENT = 0x000000ffffffffffL;
protected static final long INCREMENT_MAX = 0x0000010000000000L;
@ -63,7 +63,6 @@ public class UlidSpecCreator {
public UlidSpecCreator() {
this.timestampStrategy = new DefaultTimestampStrategy();
this.randomStrategy = new DefaultRandomStrategy();
this.reset();
}
/**
@ -181,6 +180,7 @@ public class UlidSpecCreator {
this.randomStrategy.nextBytes(bytes);
this.random1 = UlidUtil.toNumber(bytes, 0, 5);
this.random2 = UlidUtil.toNumber(bytes, 5, 10);
// Save the random values
this.randomMax1 = this.random1 | INCREMENT_MAX;
this.randomMax2 = this.random2 | INCREMENT_MAX;
@ -194,11 +194,13 @@ public class UlidSpecCreator {
*
* @throws UlidCreatorException if an overrun happens.
*/
protected synchronized void increment() {
if ((++this.random2 > this.randomMax2) && (++this.random1 > this.randomMax1)) {
this.reset();
throw new UlidCreatorException(OVERRUN_MESSAGE);
if (++this.random2 >= this.randomMax2) {
this.random2 = this.random2 & HALF_RANDOM_COMPONENT;
if ((++this.random1 >= this.randomMax1)) {
this.reset();
throw new UlidCreatorException(OVERRUN_MESSAGE);
}
}
}

View File

@ -4,13 +4,9 @@ import com.github.f4b6a3.ulid.creator.UlidSpecCreator;
class UlidSpecCreatorMock extends UlidSpecCreator {
public UlidSpecCreatorMock(long previousTimestamp) {
super();
this.previousTimestamp = previousTimestamp;
}
public UlidSpecCreatorMock(long random1, long random2, long randomMax1, long randomMax2, long previousTimestamp) {
super();
this.random1 = random1;
this.random2 = random2;

View File

@ -37,7 +37,7 @@ public class UlidSpecCreatorTest {
@Test
public void testRandomMostSignificantBits() {
UlidSpecCreatorMock creator = new UlidSpecCreatorMock(TIMESTAMP);
UlidSpecCreator creator = new UlidSpecCreator();
creator.withTimestampStrategy(new FixedTimestampStretegy(TIMESTAMP));
UUID uuid = creator.create();
@ -61,7 +61,7 @@ public class UlidSpecCreatorTest {
@Test
public void testRandomLeastSignificantBits() {
UlidSpecCreatorMock creator = new UlidSpecCreatorMock(TIMESTAMP);
UlidSpecCreator creator = new UlidSpecCreator();
creator.withTimestampStrategy(new FixedTimestampStretegy(TIMESTAMP));
UUID uuid = creator.create();
@ -84,10 +84,11 @@ public class UlidSpecCreatorTest {
@Test
public void testIncrementOfRandomLeastSignificantBits() {
UlidSpecCreatorMock creator = new UlidSpecCreatorMock(TIMESTAMP);
UlidSpecCreator creator = new UlidSpecCreator();
creator.withTimestampStrategy(new FixedTimestampStretegy(TIMESTAMP));
long random2 = creator.getRandom2();
creator.create();
long random2 = creator.random2;
UUID uuid = new UUID(0, 0);
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
@ -95,7 +96,7 @@ public class UlidSpecCreatorTest {
}
long expected2 = random2 + DEFAULT_LOOP_MAX;
long rand2 = creator.getRandom2();
long rand2 = creator.random2;
assertEquals("Wrong low random after loop.", expected2, rand2);
rand2 = creator.extractRandom2(uuid);
@ -105,10 +106,11 @@ public class UlidSpecCreatorTest {
@Test
public void testIncrementOfRandomMostSignificantBits() {
UlidSpecCreatorMock creator = new UlidSpecCreatorMock(TIMESTAMP);
UlidSpecCreator creator = new UlidSpecCreator();
creator.withTimestampStrategy(new FixedTimestampStretegy(TIMESTAMP));
long random1 = creator.getRandom1();
creator.create();
long random1 = creator.random1;
UUID uuid = new UUID(0, 0);
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
@ -116,7 +118,7 @@ public class UlidSpecCreatorTest {
}
long expected1 = random1;
long rand1 = creator.getRandom1();
long rand1 = creator.random1;
assertEquals("Wrong high random after loop.", expected1, rand1);
rand1 = creator.extractRandom1(uuid);
@ -135,6 +137,8 @@ public class UlidSpecCreatorTest {
random1 = max1;
random2 = max2 - DEFAULT_LOOP_MAX;
random2--; // Adjust
UlidSpecCreatorMock creator = new UlidSpecCreatorMock(random1, random2, max1, max2, TIMESTAMP);
creator.withTimestampStrategy(new FixedTimestampStretegy(TIMESTAMP));
@ -173,6 +177,8 @@ public class UlidSpecCreatorTest {
random1 = max1;
random2 = max2 - DEFAULT_LOOP_MAX;
random2--; // Adjust
UlidSpecCreatorMock creator = new UlidSpecCreatorMock(random1, random2, max1, max2, TIMESTAMP);
creator.withTimestampStrategy(new FixedTimestampStretegy(TIMESTAMP));
@ -186,7 +192,7 @@ public class UlidSpecCreatorTest {
assertEquals("Incorrect high random after loop.", expected1, rand1);
long rand2 = creator.extractRandom2(uuid);
long expected2 = (max2 & UlidSpecCreatorMock.HALF_RANDOM_COMPONENT);
long expected2 = (max2 & UlidSpecCreatorMock.HALF_RANDOM_COMPONENT) - 1;
assertEquals("Incorrect low random after loop.", expected2, rand2);
long hi1 = random1 & UlidSpecCreatorMock.HALF_RANDOM_COMPONENT;