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

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

推荐答案

最后根据UUID写了一些我自己的东西.java实现.请注意,我是not generating a 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());
    }       
}

Usage

RandomUtil.unique()

Tests

我测试了一些输入,以确保其正常工作:

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));
}

Java相关问答推荐

Java Android OnKeyspel事件未触发

将偶数元素移动到数组的前面,同时保持相对顺序

使用包私有构造函数强制子类Java类

强制Mockito返回null而不是emtpy list

Java自定义ThreadPool—暂停任务提交并取消当前排队任务

XPages-在第二次点击按钮之前延迟

流迭代列表<;对象>;上的NoSuchElementException

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

如何为JavaFX Spring Boot应用程序制作Windows/MacOS/Linux安装程序

带有Health Check的Spring Boot BuildPack打破了本机映像构建过程

没有使用Lombok生成的参数

使用迭代器遍历HashMap不会因IF条件而停止

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

为什么相同的数据条码在视觉上看起来不同?

如何制作回文程序?

为什么我的登录终结点不能被任何请求访问?

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举