java - Java中的Base32编码UUID

标签 java encoding uuid

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

关于java - Java中的Base32编码UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21103363/

相关文章:

java - 使用 DefaultHttpClient 设置语言环境?

java - 为什么 HashSet 说它不包含这个对象?

java - 语言环境 Caldroid

java - 我无法在 java 文件中写入一些字符(编码问题)

encoding - 用C++代码编写FFMPEG的Tee Pseudo muxer

java - SonarQube 5.4 无法启动包装器错误

json - 如何配置 F# JSON 类型提供程序以对 POST 请求使用 UTF-8?

linq - db4o、Linq 和 UUID

java - ANDROID_ID 有问题

postgresql - 当我使用 sequelize 时将 uuid 转换为 postgres 中的 varchar