Кто-нибудь может поделиться опытом?
Существует 2^122
возможных значений для UUID типа 4. (В спецификации сказано, что вы теряете 2 бита для типа и еще 4 бита для номера версии.)
Предполагая, что вы должны были генерировать 1 миллион случайных UUID в секунду, вероятность появления дубликата в вашей жизни была бы чрезвычайно мала. И чтобы обнаружить дубликат, вам нужно решить проблему сравнения 1 миллиона новых UUID в секунду с всеми UUID, которые вы ранее сгенерировали 1 !
Вероятность того, что кто-либо испытал (т. Е. действительно заметил ) дубликат в реальной жизни, даже меньше, чем исчезающе мала ... из-за практической сложности поиска столкновений.
Теперь, конечно, вы обычно будете использовать генератор псевдослучайных чисел, а не источник действительно случайных чисел. Но я думаю, мы можем быть уверены, что если вы используете заслуживающего доверия провайдера для своих случайных чисел с криптографической стойкостью, то будет криптографической стойкостью, и вероятность повторов будет такой же, как и для идеального (не смещенный) генератор случайных чисел.
Однако, если бы вы использовали JVM с «сломанным» генератором криптослучайных чисел, все ставки отключены. (И это может включать некоторые обходные пути для проблем «нехватки энтропии» в некоторых системах. Или вероятность того, что кто-то возился с вашей JRE, либо в вашей системе, либо в восходящем направлении.)
1 - Предполагая, что вы использовали «какое-то двоичное btree», как предложено анонимным комментатором, каждому UUID потребуется O(NlogN)
бит ОЗУ для представления N
различных UUID, предполагающих низкую плотность и случайное распределение битов. Теперь умножьте это на 1 000 000 и количество секунд, для которых вы собираетесь запустить эксперимент. Я не думаю, что это практично в течение периода времени, необходимого для проверки на столкновения высококачественного ГСЧ. Даже с (гипотетическими) умными представлениями.