Base32在Java中编码UUID

Base32在Java中编码UUID,java,encoding,uuid,Java,Encoding,Uuid,在Java中创建和Base32编码随机UUID最省时的方法是什么?我想使用Base32编码来存储URL中可用的全局唯一ID。Base32仍然使用=字符填充,因此如果您真的想避免URL转义,您需要对其进行处理 如果您确实想避免使用Base16,我建议您使用Base64而不是Base32。如果要使用RFC标准,请尝试。但是,该标准还使用“=”作为尾随填充,因此需要对其进行转义。它的替代品是: +->- /-> =->= 就我个人而言,我使用一种叫做Y64的变体。它的替代品是: +->. /->

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

Base32仍然使用
=
字符填充,因此如果您真的想避免URL转义,您需要对其进行处理

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

  • +->-
  • /->
  • =->=
就我个人而言,我使用一种叫做Y64的变体。它的替代品是:

  • +->.
  • /->
  • =->-
这不是RFC标准,但至少您不必担心转义尾随“=”的问题

Apache Commons编解码器同时提供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());

Base32仍然使用
=
字符填充,所以如果您确实想避免URL转义,则需要对其进行处理

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

  • +->-
  • /->
  • =->=
就我个人而言,我使用一种叫做Y64的变体。它的替代品是:

  • +->.
  • /->
  • =->-
这不是RFC标准,但至少您不必担心转义尾随“=”的问题

Apache Commons编解码器同时提供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());
编解码器可以将UUID编码为base32字符串

//返回一个base-32字符串
UuidCodec codec=new Base32Codec();
UUID UUID=UUID.fromString(“01234567-89AB-4DEF-A123-456789ABCDEF”);
String String=codec.encode(uuid);//aerukz4jvng67ijdivtytk6n54
同一格式中还有用于其他编码的编解码器。

编解码器可以将UUID编码为base32字符串

//返回一个base-32字符串
UuidCodec codec=new Base32Codec();
UUID UUID=UUID.fromString(“01234567-89AB-4DEF-A123-456789ABCDEF”);
String String=codec.encode(uuid);//aerukz4jvng67ijdivtytk6n54

在同一种格式中还有其他编码的编解码器。

我想他想压缩表示HTTP GET的UUID所需的字符。毕竟,HTTP GET的长度有一个非常重要的限制。我看不出这个问题有任何问题。@GlennLane Base64和Base32都会增加UUID的大小,而且因为它已经是一个十六进制字符串(带破折号),所以在URL重新编码中使用它没有问题。因此“你为什么要那样做”。他在一个URL中使用它们。。。所以它们被表示为字符串。大多数人会使用十六进制,但它是32个字符。使用Base64是22个字符。@BrianRoach我想我知道这里的混乱。。。他不想对36个字符的UUID十六进制字符串进行Base32编码。他想对16字节的二进制文件进行编码,没错。如果生成后编码没有太多开销,那么当超过数十亿个节点时,节省的空间就开始变得显著。我想他希望压缩表示HTTP get的UUID所需的字符。毕竟,HTTP GET的长度有一个非常重要的限制。我看不出这个问题有任何问题。@GlennLane Base64和Base32都会增加UUID的大小,而且因为它已经是一个十六进制字符串(带破折号),所以在URL重新编码中使用它没有问题。因此“你为什么要那样做”。他在一个URL中使用它们。。。所以它们被表示为字符串。大多数人会使用十六进制,但它是32个字符。使用Base64是22个字符。@BrianRoach我想我知道这里的混乱。。。他不想对36个字符的UUID十六进制字符串进行Base32编码。他想对16字节的二进制文件进行编码,没错。如果生成后编码没有太多开销,那么当超过数十亿个节点时,节省的空间就开始变得显著。问题是,当使用不区分大小写的文件系统时,大写-小写输出字符串。当使用不区分大小写的文件系统时,问题是大写-小写输出字符串