在保留唯一性的同时缩短java UUID

时间:2013-12-03 20:31:01

标签: java uuid

我正在尝试缩短java UUID,同时保留与UUID相同的唯一性。 我写了以下代码:

public static void main(String[] args) {
    UUID uid=UUID.randomUUID();
    String shortId=to62System(uid.getMostSignificantBits())+
        to62System(uid.getLeastSignificantBits());

    System.out.println(shortId);
}

static char[] DIGITS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
static int RADIX = DIGITS.length;

public static String to62System(long value) {
    if (value == 0) {
        return "0";
    } else {
        char[] buf = new char[11];
        int charPos = 10;
        long i = value;
        while (i != 0) {
            buf[charPos--] = DIGITS[Math.abs((int) (i % RADIX))];
            i /= RADIX;
        }
        return new String(buf, charPos + 1, (10 - charPos));
    }
}

我做得对,还是忽略了重要的事情?

3 个答案:

答案 0 :(得分:4)

我使用org.apache.commons.codec.binary.Base64将UUID转换为url-safe唯一字符串,其长度为22个字符,并且与UUID具有相同的唯一性。

我在Storing UUID as base64 String

上发布了我的代码

答案 1 :(得分:2)

看看FriendlyId图书馆。该库允许将 UUID 编码为 Base62 字符串( Url62 )并返回。实现了唯一性,编码字符串更短。

https://github.com/Devskiller/friendly-id

答案 2 :(得分:-1)

我相信,即使您通过更改为基数而将其减少到22个字符,也可以安全地截断几个字符,并且仍然可以确定不会遇到任何冲突,因为您可能知道涉及天文数字。大声笑很喜欢第一个人的回答,认为您就像从标准UUID中抓取一些字符并称其为哈哈