Storing UUID as base64 String Storing UUID as base64 String arrays arrays

Storing UUID as base64 String


I was also trying to do something similar. I am working with a Java application which uses UUIDs of the form 6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8 (which are generated with the standard UUID lib in Java). In my case I needed to be able to get this UUID down to 30 characters or less. I used Base64 and these are my convenience functions. Hopefully they will be helpful for someone as the solution was not obvious to me right away.

Usage:

String uuid_str = "6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8";String uuid_as_64 = uuidToBase64(uuid_str);System.out.println("as base64: "+uuid_as_64);System.out.println("as uuid: "+uuidFromBase64(uuid_as_64));

Output:

as base64: b8tRS7h4TJ2Vt43Dp85v2Aas uuid  : 6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8

Functions:

import org.apache.commons.codec.binary.Base64;private static String uuidToBase64(String str) {    Base64 base64 = new Base64();    UUID uuid = UUID.fromString(str);    ByteBuffer bb = ByteBuffer.wrap(new byte[16]);    bb.putLong(uuid.getMostSignificantBits());    bb.putLong(uuid.getLeastSignificantBits());    return base64.encodeBase64URLSafeString(bb.array());}private static String uuidFromBase64(String str) {    Base64 base64 = new Base64();     byte[] bytes = base64.decodeBase64(str);    ByteBuffer bb = ByteBuffer.wrap(bytes);    UUID uuid = new UUID(bb.getLong(), bb.getLong());    return uuid.toString();}


You can safely drop the padding "==" in this application. If you were to decode the base-64 text back to bytes, some libraries would expect it to be there, but since you are just using the resulting string as a key, it's not a problem.

I'd use Base-64 because its encoding characters can be URL-safe, and it looks less like gibberish. But there's also Base-85. It uses more symbols and codes 4 bytes as 5 characters, so you could get your text down to 20 characters.


Here's my code, it uses org.apache.commons.codec.binary.Base64 to produce url-safe unique strings that are 22 characters in length (and that have the same uniqueness as UUID).

private static Base64 BASE64 = new Base64(true);public static String generateKey(){    UUID uuid = UUID.randomUUID();    byte[] uuidArray = KeyGenerator.toByteArray(uuid);    byte[] encodedArray = BASE64.encode(uuidArray);    String returnValue = new String(encodedArray);    returnValue = StringUtils.removeEnd(returnValue, "\r\n");    return returnValue;}public static UUID convertKey(String key){    UUID returnValue = null;    if(StringUtils.isNotBlank(key)){        // Convert base64 string to a byte array        byte[] decodedArray = BASE64.decode(key);        returnValue = KeyGenerator.fromByteArray(decodedArray);    }    return returnValue;}private static byte[] toByteArray(UUID uuid) {    byte[] byteArray = new byte[(Long.SIZE / Byte.SIZE) * 2];    ByteBuffer buffer = ByteBuffer.wrap(byteArray);    LongBuffer longBuffer = buffer.asLongBuffer();    longBuffer.put(new long[] { uuid.getMostSignificantBits(), uuid.getLeastSignificantBits() });    return byteArray;}private static UUID fromByteArray(byte[] bytes) {    ByteBuffer buffer = ByteBuffer.wrap(bytes);    LongBuffer longBuffer = buffer.asLongBuffer();    return new UUID(longBuffer.get(0), longBuffer.get(1));}