Skip to content

Commit

Permalink
Optimize base-n codecs
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiolimace committed Apr 7, 2024
1 parent 9b7331b commit b4a1a42
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 95 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -274,10 +274,16 @@ public String encode(UUID uuid) {
@Override
public UUID decode(String string) {
try {
base.validate(string);
validate(string);
return decoder.apply(string);
} catch (RuntimeException e) {
throw new InvalidUuidException(e.getMessage(), e);
}
}

protected void validate(String string) {
if (string == null || string.length() != this.base.getLength()) {
throw InvalidUuidException.newInstance(string);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,46 +45,20 @@ public final class Base16Decoder extends BaseNDecoder {
public Base16Decoder(BaseN base) {
super(base);
}

@Override
public UUID apply(String string) {

long msb = 0;
long lsb = 0;

msb = (msb << 4) | (map.get(string.charAt(0x00)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x01)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x02)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x03)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x04)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x05)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x06)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x07)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x08)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x09)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x0a)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x0b)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x0c)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x0d)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x0e)) & 0xffL);
msb = (msb << 4) | (map.get(string.charAt(0x0f)) & 0xffL);
for (int i = 0; i < 16; i++) {
msb = (msb << 4) | get(string, i);
}

lsb = (lsb << 4) | (map.get(string.charAt(0x10)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x11)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x12)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x13)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x14)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x15)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x16)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x17)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x18)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x19)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x1a)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x1b)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x1c)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x1d)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x1e)) & 0xffL);
lsb = (lsb << 4) | (map.get(string.charAt(0x1f)) & 0xffL);
for (int i = 16; i < 32; i++) {
lsb = (lsb << 4) | get(string, i);
}

return new UUID(msb, lsb);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,36 +52,18 @@ public UUID apply(String string) {
long msb = 0;
long lsb = 0;

msb = (msb << 5) | (map.get(string.charAt(0x00)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x01)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x02)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x03)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x04)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x05)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x06)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x07)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x08)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x09)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x0a)) & 0xffL);
msb = (msb << 5) | (map.get(string.charAt(0x0b)) & 0xffL);

msb = (msb << 4) | ((map.get(string.charAt(0x0c)) & 0xffL) >>> 1);

lsb = (lsb << 5) | (map.get(string.charAt(0x0c)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x0d)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x0e)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x0f)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x10)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x11)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x12)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x13)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x14)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x15)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x16)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x17)) & 0xffL);
lsb = (lsb << 5) | (map.get(string.charAt(0x18)) & 0xffL);

lsb = (lsb << 3) | ((map.get(string.charAt(0x19)) & 0xffL) >>> 2);
for (int i = 0; i < 12; i++) {
msb = (msb << 5) | get(string, i);
}

msb = (msb << 4) | (get(string, 12) >>> 1);
lsb = (lsb << 5) | get(string, 12);

for (int i = 13; i < 25; i++) {
lsb = (lsb << 5) | get(string, i);
}

lsb = (lsb << 3) | (get(string, 25) >>> 2);

return new UUID(msb, lsb);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,32 +52,18 @@ public UUID apply(String string) {
long msb = 0;
long lsb = 0;

msb = (msb << 6) | (map.get(string.charAt(0x00)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x01)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x02)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x03)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x04)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x05)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x06)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x07)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x08)) & 0xffL);
msb = (msb << 6) | (map.get(string.charAt(0x09)) & 0xffL);

msb = (msb << 4) | ((map.get(string.charAt(0x0a)) & 0xffL) >>> 2);

lsb = (lsb << 6) | (map.get(string.charAt(0x0a)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x0b)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x0c)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x0d)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x0e)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x0f)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x10)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x11)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x12)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x13)) & 0xffL);
lsb = (lsb << 6) | (map.get(string.charAt(0x14)) & 0xffL);

lsb = (lsb << 2) | ((map.get(string.charAt(0x15)) & 0xffL) >>> 4);
for (int i = 0; i < 10; i++) {
msb = (msb << 6) | get(string, i);
}

msb = (msb << 4) | (get(string, 10) >>> 2);
lsb = (lsb << 6) | get(string, 10);

for (int i = 11; i < 21; i++) {
lsb = (lsb << 6) | get(string, i);
}

lsb = (lsb << 2) | (get(string, 21) >>> 4);

return new UUID(msb, lsb);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.function.Function;

import com.github.f4b6a3.uuid.codec.base.BaseN;
import com.github.f4b6a3.uuid.exception.InvalidUuidException;
import com.github.f4b6a3.uuid.util.immutable.ByteArray;

/**
Expand All @@ -54,4 +55,12 @@ public BaseNDecoder(BaseN base) {
this.base = base;
this.map = base.getMap();
}

protected long get(String string, int i) {
final byte value = map.get(string.charAt(i));
if (value < 0) {
throw InvalidUuidException.newInstance(string);
}
return value & 0xffL;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,14 @@ public BaseNRemainderDecoder(BaseN base) {

public UUID apply(String string) {

final char[] chars = string.toCharArray();

long msb = 0;
long lsb = 0;

long rem = 0; // remainder
long[] ans; // [product, overflow]

for (int i = 0; i < chars.length; i++) {
rem = (int) map.get(chars[i]);
for (int i = 0; i < base.getLength(); i++) {
rem = get(string, i);
ans = multiply(lsb, multiplier, rem);
lsb = ans[0];
rem = ans[1];
Expand Down

0 comments on commit b4a1a42

Please sign in to comment.