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