在Java中Base32编码UUID

问题描述 投票:0回答:3

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

java encoding uuid
3个回答
5
投票

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

1
投票

我同意 Base64Url 可能更合适的讨论,但我也看到了在 Base32 中生成唯一值的好处。它不区分大小写,如果有人参与的话更容易处理。

这是我使用 Guava 的 BaseEncoding 将 UUID 转换为 Base32 的代码。

    public static String toBase32(UUID uuid){
        ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
        bb.putLong(uuid.getMostSignificantBits());
        bb.putLong(uuid.getLeastSignificantBits());
        return BaseEncoding.base32().omitPadding().encode(bb.array());
    }

1
投票

编解码器

Base32Codec
可以有效地将UUID编码为base-32。

// Returns a base-32 string
// uuid::: 01234567-89AB-4DEF-A123-456789ABCDEF
// base32: aerukz4jvng67ijdivtytk6n54
String string = Base32Codec.INSTANCE.encode(uuid);

uuid-creator的同一个package中还有其他编码的编解码器。


免责声明:我是

uuid-creator
的主要贡献者。

© www.soinside.com 2019 - 2024. All rights reserved.