UUID.randomUUID() против SecureRandom
Я пытаюсь понять преимущества использования UUID.randomUUID() по сравнению с генератором SecureRandom, так как первый использует securerandom внутри.
3 ответа
Ну, исходный код показывает 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 неслучайных битов, что может считаться недостатком, если вы привередливы.
Случайные числа имеют случайный шанс повторения. Чем ниже случайность (если не существует какой-либо координации), тем выше вероятность получения одного и того же числа дважды.
https://en.wikipedia.org/wiki/Birthday_problem
По мере того, как вы создаете больше случайных чисел, вероятность повторения одного и того же числа увеличивается, так как каждый идентификатор должен отличаться от любого другого идентификатора.
SecureRandom позволяет вам выбирать, сколько бит случайности вы хотите. Сделайте это слишком маленьким, и есть большая вероятность, что они будут повторяться. Вы можете получить дубликат случайного 32-битного идентификатора за доли секунды.
UUID устанавливает стандарт на 128 бит (или, как указывает uoyilmaz, 122 бита являются случайными). Этого достаточно для большинства случаев использования. Однако, если вам нужна случайная строка, я хотел бы использовать больше битов и / или более высокую базу, чем 16. Java, например, поддерживает базы 36 и 64, что означает, что вы можете иметь более короткие идентификаторы или больше случайности для одного и того же идентификатора длины.
Примечание: формат UUID имеет несколько -
в этом дампе я не вижу их значения, они просто делают строку длиннее.
Спасибо за все предоставленные технические ответы. Я сам был сбит с толку тем различием, которое привело меня сюда. Но затем меня осенила мысль: если вы вызываете функцию только один раз, то нет никакой разницы, поскольку оба метода генерируют число, которое невозможно вычислить заранее. Но если вызвать функцию несколько раз, то они здесь различаются, потому что статистическое нормальное распределение является свойством генератора случайных чисел, тогда как это не свойство UUID. UUID стремится к уникальности и фактически получает предоставленный номер, используя аппаратный MAC-адрес вашего компьютера, текущую эпоху в секундах и т. Д. И в конечном итоге, если вы вызываете для цикла значения UUID, они не будут статистически нормально распределены.
UUID - это не случайное число: это универсальный уникальный идентификатор. Вы можете быть уверены, что никто не может сгенерировать одну и ту же шестнадцатеричную строку.
Другое дело - случайное число: оно не является шестнадцатеричной строкой и не является универсально уникальным.
Эта библиотека обеспечивает более эффективный и полный генератор UUID.