在JAVA中生成UUIDstring的有效方法(UUID.randomUUID()。toString()不带破折号)

我想要一个有效的工具来生成独特的字节序列。 UUID是一个很好的select,但是UUID.randomUUID().toString()生成类似于44e128a5-ac7a-4c9a-be4c-224b6bf81b20 ,只要你不需要通过HTTP传输它,在这种情况下,破折号需要即将被删除。

我正在寻找一个有效的方法来产生一个随机string,只能从字母数字字符(没有破折号或任何其他特殊符号)。

这样做:

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

你可以在这个线程的URL中看到虚线,不需要从HTTP请求中删除虚线。 但是如果你想准备格式正确的URL而不依赖于数据,你应该使用URLEncoder.encode(String data,String encoding),而不是改变你的数据的标准格式。 对于UUIDstring表示破折号是正常的。

我使用JUG(Java UUID Generator)来生成唯一的ID。 它在JVM中是唯一的。 很好用。 以下是供您参考的代码:

 private static final SecureRandom secureRandom = new SecureRandom(); private static final UUIDGenerator generator = UUIDGenerator.getInstance(); public synchronized static String generateUniqueId() { UUID uuid = generator.generateRandomBasedUUID(secureRandom); return uuid.toString().replaceAll("-", "").toUpperCase(); } 

您可以从https://github.com/cowtowncoder/java-uuid-generator下载该库;

基于UUID.java实现完成我自己写的东西。 请注意,我不是以最有效的方式生成UUID ,而只是一个随机的32字节hexstring。

履行

 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() 

testing

我testing过的一些input,以确保它的工作:

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

我很惊讶看到这么多的stringreplaceUUID的想法。 这个怎么样:

 UUID temp = UUID.randomUUID(); String uuidString = Long.toHexString(temp.getMostSignificantBits()) + Long.toHexString(temp.getLeastSignificantBits()); 

这是这样做的,因为UUID的整个toString()已经更昂贵了,更不用提必须parsing和执行的正则expression式,或者用空stringreplace。

简单的解决scheme是

 UUID.randomUUID().toString().replace("-", "") 

(就像现有的解决scheme一样,只是避免了String#replaceAll调用,这里不需要正则expression式的replace,所以String#的replace感觉更自然,虽然在技术上仍然是用正则expression式来实现的,因为生成的UUID是比replace成本更高,运行时间不应该有显着差异。)

对于大多数场景,使用UUID类可能足够快,但我希望某些专门的手写变体(不需要后处理)更快。 无论如何,整体计算的瓶颈通常是随机数发生器。 在UUID类的情况下,它使用SecureRandom 。

使用哪个随机数发生器也是取决于应用的折衷。 如果它是安全敏感的,一般来说,SecureRandom是build议。 否则, ThreadLocalRandom是一种替代方法(比SecureRandom或旧的Random更快,但不是encryption安全的)。

我使用org.apache.commons.codec.binary.Base64将UUID转换为长度为22个字符且与UUID具有相同唯一性的url安全唯一string。

我张贴我的代码存储UUID为base64string