Base32在Java中编码UUID

时间:2014-01-13 23:23:03

标签: java encoding uuid

在Java中创建和Base32编码随机UUID的最有效时间是什么?我想使用Base32编码来存储可在URL中使用的全局唯一ID。

1 个答案:

答案 0 :(得分:3)

Base32仍然使用=字符填充,因此如果你真的想避免网址转义,你需要做些什么。

如果您真的想避免使用Base16,我建议您使用Base64而不是Base32。如果您想使用RFC标准,请尝试base64url。但是,该标准也使用" ="对于尾随填充,所以你需要逃避它。它的替换是:

  • + -> -
  • / -> _
  • = -> =

就个人而言,我使用一种名为Y64的变体。它的替换是:

  • + -> .
  • / -> _
  • = -> -

它不是RFC标准,但至少你不必担心逃避尾随" ="。

Apache Commons Codec提供Base64和Base32。以下是Base64与Y64变体

的示例

编码:

UUID uuid = UUID.randomUUID();
ByteBuffer uuidBuffer = ByteBuffer.allocate(16);
LongBuffer longBuffer = uuidBuffer.asLongBuffer();
longBuffer.put(uuid.getMostSignificantBits());
longBuffer.put(uuid.getLeastSignificantBits());
String encoded = new String(Base64.encode(uuidBuffer.array()), 
        Charset.forName("US-ASCII"));
encoded = encoded.replace('+', '.')
        .replace('/', '_')
        .replace('=', '-');

解码:

String encoded; // from your request parameters or whatever
encoded = encoded.replace('.', '+')
        .replace('_', '/')
        .replace('-', '=');
ByteBuffer uuidBuffer = ByteBuffer.wrap(Base64.decode(
        encoded.getBytes(Charset.forName("US-ASCII"))));
LongBuffer longBuffer = uuidBuffer.asLongBuffer();
UUID uuid = new UUID(longBuffer.get(), longBuffer.get());