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

最佳答案

Base32仍然使用=字符填充,因此,如果您确实想避免URL转义,则需要对此进行一些处理。

如果您确实想避免使用Base16,建议您使用Base64而不是Base32。如果要使用RFC标准,请尝试base64url。但是,该标准还将尾随填充使用“ =”,因此您需要对其进行转义。它的替代是:


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


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


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


它不是RFC标准,但是至少您不必担心转义结尾的“ =”。

Apache Commons Codec同时提供Base64和Base32。这是带有Y64变体的Base64的示例

编码:

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());

10-01 06:52