Эффективный метод для генерации строки UUID в JAVA (UUID.randomUUID(). ToString() без тире)
Я бы хотел, чтобы эффективная утилита генерировала уникальные последовательности байтов. UUID - хороший кандидат, но UUID.randomUUID().toString()
генерирует материал типа 44e128a5-ac7a-4c9a-be4c-224b6bf81b20
, который хорош, пока вам не нужно передавать его по HTTP, и в этом случае тире нужно удалить.
Я ищу эффективный способ генерации случайных строк, только из буквенно-цифровых символов (без тире или каких-либо других специальных символов).
Ответы
Ответ 1
Закончил писать что-то свое, основанное на реализации 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));
}
Ответ 2
Это делает:
public static void main(String[] args) {
final String uuid = UUID.randomUUID().toString().replace("-", "");
System.out.println("uuid = " + uuid);
}
Ответ 3
Дефисы не нужно удалять из HTTP-запроса, как вы можете видеть в URL-адресе этого потока.
Но если вы хотите подготовить правильно сформированный URL-адрес без зависимости от данных, вы должны использовать URLEncoder.encode(String data, String encoding) вместо изменения стандартной формы ваших данных.
Для строкового представления UUID тире нормально.
Ответ 4
Я использовал JUG (Java UUID Generator) для генерации уникального идентификатора.
Он уникален для 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
Ответ 5
Я поражен тем, что многие строки заменяют идеи UUID. Как насчет этого:
UUID temp = UUID.randomUUID();
String uuidString = Long.toHexString(temp.getMostSignificantBits())
+ Long.toHexString(temp.getLeastSignificantBits());
Это быстрый способ сделать это, так как весь toString() UUID уже стоит дороже, не говоря уже о регулярном выражении, которое нужно разобрать и выполнить или заменить пустой строкой.
Ответ 6
Простым решением является
UUID.randomUUID().toString().replace("-", "")
(Как и существующие решения, только это позволяет избежать вызова String # replaceAll. Здесь не требуется замена регулярного выражения, поэтому String # replace чувствует себя более естественным, хотя технически это все еще выполняется с регулярными выражениями. Учитывая, что генерация UUID более дорогостоящая, чем замена, не должно быть существенной разницей времени выполнения.)
Использование класса UUID, вероятно, достаточно быстро для большинства сценариев, хотя я бы ожидал, что некоторый специализированный рукописный вариант, который не требует постпроцессинга, будет быстрее. Во всяком случае, узким местом общего вычисления обычно будет генератор случайных чисел. В случае класса UUID он использует SecureRandom.
Какой генератор случайных чисел использовать, также является компромиссом, который зависит от приложения. Если он чувствителен к безопасности, SecureRandom, в общем, рекомендуется. В противном случае ThreadLocalRandom является альтернативой (быстрее, чем SecureRandom или старый Random, но не криптографически безопасно).
Ответ 7
Я использую org.apache.commons.codec.binary.Base64 для преобразования UUID в уникальную строку с уникальным строком длиной 22 символа и имеет ту же уникальность, что и UUID.
Я отправил свой код на Сохранение UUID в качестве строки base64