小编典典

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

all

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

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


阅读 74

收藏
2022-07-04

共1个答案

小编典典

最终基于 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));
}
2022-07-04