我想要一个有效的实用程序来生成唯一的字节序列。UUID 是一个很好的候选者,但UUID.randomUUID().toString()生成的东西44e128a5-ac7a-4c9a-be4c-224b6bf81b20很好,但我更喜欢无破折号的字符串。
UUID.randomUUID().toString()
44e128a5-ac7a-4c9a-be4c-224b6bf81b20
我正在寻找一种仅从字母数字字符(没有破折号或任何其他特殊符号)生成随机字符串的有效方法。
最终基于 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)); }