Warm tip: This article is reproduced from serverfault.com, please click

random-在JAVA中生成UUID字符串的有效方法(不带破折号的UUID.randomUUID()。toString())

(random - Efficient method to generate UUID String in JAVA (UUID.randomUUID().toString() without the dashes))

发布于 2010-09-27 14:05:52

我想要一个高效的实用程序来生成唯一的字节序列。UUID是一个很好的候选人,但是会UUID.randomUUID().toString()生成类似的东西44e128a5-ac7a-4c9a-be4c-224b6bf81b20,但是我更喜欢无破折号的字符串。

我正在寻找一种仅从字母数字字符(无破折号或任何其他特殊符号)生成随机字符串的有效方法。

Questioner
Maxim Veksler
Viewed
11
Maxim Veksler 2017-04-08 01:42:37

最终基于UUID.java实现编写了自己的东西。请注意,我并不是在生成UUID,而是以我能想到的最有效的方式生成一个随机的32字节十六进制字符串。

执行

import java.security.SecureRandom;
import java.util.UUID;

public class RandomUtil {
    // Maxim: Copied from UUID implementation :)
    private static volatile SecureRandom numberGenerator = null;
    private static final long MSB = 0x8000000000000000L;

    public static String unique() {
        SecureRandom ng = numberGenerator;
        if (ng == null) {
            numberGenerator = ng = new SecureRandom();
        }

        return Long.toHexString(MSB | ng.nextLong()) + Long.toHexString(MSB | ng.nextLong());
    }       
}

用法

RandomUtil.unique()

测验

我已经测试过一些输入,以确保它可以正常工作:

public static void main(String[] args) {
    System.out.println(UUID.randomUUID().toString());
    System.out.println(RandomUtil.unique());

    System.out.println();
    System.out.println(Long.toHexString(0x8000000000000000L |21));
    System.out.println(Long.toBinaryString(0x8000000000000000L |21));
    System.out.println(Long.toHexString(Long.MAX_VALUE + 1));
}