init
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user