71 lines
2.6 KiB
Java
71 lines
2.6 KiB
Java
package com.eactive.ext.kjb.ums;
|
|
|
|
import java.math.BigInteger;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.UUID;
|
|
|
|
public class UUIDBase62Util {
|
|
private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
|
|
public static String uuidStringToBase62(String uuidStr) {
|
|
UUID uuid = UUID.fromString(uuidStr);
|
|
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
|
|
bb.putLong(uuid.getMostSignificantBits());
|
|
bb.putLong(uuid.getLeastSignificantBits());
|
|
BigInteger bigInt = new BigInteger(1, bb.array());
|
|
return toBase62(bigInt);
|
|
}
|
|
|
|
public static String base62ToUuidString(String base62Str) {
|
|
BigInteger bigInt = fromBase62(base62Str);
|
|
byte[] bytes = toByteArray(bigInt, 16);
|
|
ByteBuffer bb = ByteBuffer.wrap(bytes);
|
|
long msb = bb.getLong();
|
|
long lsb = bb.getLong();
|
|
return new UUID(msb, lsb).toString();
|
|
}
|
|
|
|
private static String toBase62(BigInteger value) {
|
|
StringBuilder sb = new StringBuilder();
|
|
while (value.compareTo(BigInteger.ZERO) > 0) {
|
|
BigInteger[] divRem = value.divideAndRemainder(BigInteger.valueOf(62));
|
|
sb.append(BASE62.charAt(divRem[1].intValue()));
|
|
value = divRem[0];
|
|
}
|
|
// pad to 22 chars for consistent length
|
|
while (sb.length() < 22) sb.append('0');
|
|
return sb.reverse().toString();
|
|
}
|
|
|
|
private static BigInteger fromBase62(String base62) {
|
|
BigInteger result = BigInteger.ZERO;
|
|
for (char c : base62.toCharArray()) {
|
|
int digit = BASE62.indexOf(c);
|
|
if (digit == -1) throw new IllegalArgumentException("Invalid Base62 character: " + c);
|
|
result = result.multiply(BigInteger.valueOf(62)).add(BigInteger.valueOf(digit));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static byte[] toByteArray(BigInteger bigInt, int size) {
|
|
byte[] src = bigInt.toByteArray();
|
|
byte[] dst = new byte[size];
|
|
int srcPos = Math.max(0, src.length - size);
|
|
int dstPos = Math.max(0, size - src.length);
|
|
int length = Math.min(size, src.length);
|
|
System.arraycopy(src, srcPos, dst, dstPos, length);
|
|
return dst;
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
String uuid = UUID.randomUUID().toString();
|
|
String base62 = uuidStringToBase62(uuid);
|
|
String decoded = base62ToUuidString(base62);
|
|
|
|
System.out.println("UUID : " + uuid);
|
|
System.out.println("Base62: " + base62 + " (" + base62.length() + ")");
|
|
System.out.println("Decoded: " + decoded);
|
|
System.out.println("Same? " + uuid.equals(decoded));
|
|
}
|
|
}
|