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

新手上路,请多包涵

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

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

原文由 Maxim Veksler 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 883
2 个回答

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

原文由 Maxim Veksler 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是这样做的:

 public static void main(String[] args) {
    final String uuid = UUID.randomUUID().toString().replace("-", "");
    System.out.println("uuid = " + uuid);
}

原文由 Steve McLeod 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题