Подтвердить что ты не робот

UUID.randomUUID() vs SecureRandom

Я пытаюсь понять преимущества использования UUID.randomUUID() над генератором SecureRandom, поскольку первый использует securerandom внутри.

4b9b3361

Ответ 1

Ну, исходный код показывает UUID.randomUUID использует SecureRandom.

public static UUID  [More ...] randomUUID() {
    SecureRandom ng = numberGenerator;
    if (ng == null) {
        numberGenerator = ng = new SecureRandom();
    }
    byte[] randomBytes = new byte[16];
    ng.nextBytes(randomBytes);
    randomBytes[6]  &= 0x0f;  /* clear version        */
    randomBytes[6]  |= 0x40;  /* set to version 4     */
    randomBytes[8]  &= 0x3f;  /* clear variant        */
    randomBytes[8]  |= 0x80;  /* set to IETF variant  */
    return new UUID(randomBytes);
}

Как вы можете видеть, вы можете использовать любой из них, но в безопасном UUID у вас есть 6 неслучайных битов, которые можно считать недостатком, если вы придирчивы.

Ответ 2

Случайные числа имеют случайную вероятность повторения. Чем ниже случайность (если не существует некоторой координации), тем выше вероятность того, что будет производить тот же номер дважды.

https://en.wikipedia.org/wiki/Birthday_problem
Когда вы производите более случайные числа, вероятность повторения одного и того же числа увеличивается, поскольку каждый идентификатор должен отличаться от всех других идентификаторов.

SecureRandom позволяет вам выбирать, сколько бит случайности вы хотите. Сделайте его слишком маленьким, и есть хорошие шансы, что они будут повторяться. Вы можете получить повторяющийся случайный 32-разрядный идентификатор за долю секунды.

UUID устанавливает стандарт на 128 бит (или, как указывает uoyilmaz, 122 бит являются случайными). Этого достаточно для большинства случаев использования. Однако, если вы хотите случайную String, у меня возникнет соблазн использовать больше бит и/или более высокую базу, чем 16. Java, например, поддерживает базы 36 и 64, что означает, что вы можете иметь более короткие идентификаторы или больше случайности для одинакового идентификатора длины.

Примечание. Формат UUID имеет несколько - в нем дамп, хотя я не вижу их значения, они просто делают строку длиннее.

Ответ 3

UUID не является случайным числом: это универсальный уникальный идентификатор. Вы можете быть уверены, что никто не может генерировать одну и ту же шестнадцатеричную строку.

Случайное число - это еще одна история: это не шестнадцатеричная строка, и она не является универсальной.

Более эффективный и завершенный генератор UUID предоставляется эта библиотека.