Эффективный метод для генерации строки 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