我想要一个有效的实用程序来生成唯一的字节序列。UUID是一个很好的候选,但UUID. randomuuid (). tostring()会生成44e128a5-ac7a-4c9a-be4c-224b6bf81b20这样的东西,这很好,但我更喜欢无虚线字符串。
我正在寻找一种有效的方法来生成随机字符串,只从字母数字字符(没有破折号或任何其他特殊符号)。
我想要一个有效的实用程序来生成唯一的字节序列。UUID是一个很好的候选,但UUID. randomuuid (). tostring()会生成44e128a5-ac7a-4c9a-be4c-224b6bf81b20这样的东西,这很好,但我更喜欢无虚线字符串。
我正在寻找一种有效的方法来生成随机字符串,只从字母数字字符(没有破折号或任何其他特殊符号)。
当前回答
我很惊讶看到这么多字符串取代UUID的想法。这个怎么样:
UUID temp = UUID.randomUUID();
String uuidString = Long.toHexString(temp.getMostSignificantBits())
+ Long.toHexString(temp.getLeastSignificantBits());
这是最快的方法,因为整个UUID的toString()已经更加昂贵,更不用说正则表达式,它必须被解析和执行或替换为空字符串。
其他回答
这样做:
public static void main(String[] args) {
final String uuid = UUID.randomUUID().toString().replace("-", "");
System.out.println("uuid = " + uuid);
}
破折号不需要从HTTP请求中删除,因为你可以在这个线程的URL中看到。 但是如果你想准备一个不依赖于数据的格式良好的URL,你应该使用URLEncoder。编码(字符串数据,字符串编码)而不是改变你的数据的标准形式。 对于UUID字符串表示,破折号是正常的。
我使用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的想法。这个怎么样:
UUID temp = UUID.randomUUID();
String uuidString = Long.toHexString(temp.getMostSignificantBits())
+ Long.toHexString(temp.getLeastSignificantBits());
这是最快的方法,因为整个UUID的toString()已经更加昂贵,更不用说正则表达式,它必须被解析和执行或替换为空字符串。
我刚刚复制了UUID toString()方法,并更新了它以删除“-”。它会比其他解决方案更快更直接
public String generateUUIDString(UUID uuid) {
return (digits(uuid.getMostSignificantBits() >> 32, 8) +
digits(uuid.getMostSignificantBits() >> 16, 4) +
digits(uuid.getMostSignificantBits(), 4) +
digits(uuid.getLeastSignificantBits() >> 48, 4) +
digits(uuid.getLeastSignificantBits(), 12));
}
/** Returns val represented by the specified number of hex digits. */
private String digits(long val, int digits) {
long hi = 1L << (digits * 4);
return Long.toHexString(hi | (val & (hi - 1))).substring(1);
}
用法:
generateUUIDString(UUID.randomUUID())
使用反射的另一个实现
public String generateString(UUID uuid) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
if (uuid == null) {
return "";
}
Method digits = UUID.class.getDeclaredMethod("digits", long.class, int.class);
digits.setAccessible(true);
return ( (String) digits.invoke(uuid, uuid.getMostSignificantBits() >> 32, 8) +
digits.invoke(uuid, uuid.getMostSignificantBits() >> 16, 4) +
digits.invoke(uuid, uuid.getMostSignificantBits(), 4) +
digits.invoke(uuid, uuid.getLeastSignificantBits() >> 48, 4) +
digits.invoke(uuid, uuid.getLeastSignificantBits(), 12));
}