在Java中将UUID编码为Base62(而不是Base64)

8

我想要将存储在数据库中的UUID值(而不是字符串)缩短以嵌入URL中。我知道Base64适用于URL,但想尝试一下是否可以在没有破折号和下划线字符的情况下进行转换为base62。经过大量搜索,我发现:

  1. 这方面没有标准(类似于RFC2045),我是对的吗?

  2. 最重要的是,没有合适的实现方法。我找到了很多关于如何做到这一点的代码片段,但都带有某种“这是一个朴素的实现”之类的注释。是否有一个合适的实现方法(只要映射是正确的,我不介意确切的解释方式)?

  3. Apache Commons Codec和Guava中有一些基础类,用于Base32和Base64,但我发现很难将其扩展为Base62。这样做甚至可能吗(考虑到映射根本不同)?
    谢谢。


1
mime base64 不使用破折号或下划线。 - Iłya Bursov
1
@RusselYang 破折号和下划线不需要转义,我有什么遗漏吗? - Rad
@Rad. 你是对的。那为什么不只使用base64呢?你还可以包含原始的UUID字符串。 - Russel Yang
你最好使用标准的Base64Url编码——这正是它设计的目的。 - dnault
@IłyaBursov,我不太明白,URL中必须对“/”进行编码,对吧?这就是为什么我们有“Base64Url”的原因。我不喜欢除字母数字外的任何字符,更不用说斜杠了(foo/bar -> foo%2Fbar)。 - Rad
显示剩余11条评论
2个回答

7

你可以尝试使用这个库:https://github.com/Devskiller/friendly-id

The FriendlyID library converts a given UUID (with 36 characters) to a URL-friendly ID (a "FriendlyID") which is based on Base62 (with a maximum of 22 characters), as in the example below:

   UUID                                        Friendly ID
   
   c3587ec5-0976-497f-8374-61e0c2ea3da5   ->   5wbwf6yUxVBcr48AMbz9cb
   |                                           |                              
   36 characters                               22 characters or less

In addition, this library allows to:

  • convert from a FriendlyID back to the original UUID; and
  • create a new, random FriendlyID

1
我很确定当时我找到了这个库,但是不记得为什么没有使用它。 - Rad
1
友情提示:FriendlyID与其他Base62库的区别在于逆转的字母大小写。它的字母表为0123456789ABC ... abc ...,而不是标准的0123456789abc ... ABC ...。 - Alessandro

2

Base62Codec 可以高效地将 UUID 编码为 base-62。

Base62Codec codec = new Base62Codec();
String string = codec.encode(uuid);

或者:

String string = Base62Codec.INSTANCE.encode(uuid);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接