Поскольку вы решили использовать код Java для генерации уникального идентификатора, я хочу сказать, что вы должны сгенерировать уникальный идентификатор , который объединяет «уникальную» часть и «случайную» часть. Обратите внимание, что ваш текущий ответ не совсем соответствует «непредсказуемому» требованию, поскольку в нем используется Math.random()
, который не обязательно является «непредсказуемым» ГСЧ.
- «Уникальная» часть может быть монотонно увеличивающимся счетчиком, или это может быть число, сгенерированное с полным периодом линейный конгруэнтный генератор (который повторяет псевдослучайно все возможные значения в своем периоде перед повторением) , Я не рекомендую использовать только временные метки, поскольку существует риск генерирования одной и той же временной метки в быстрой последовательности.
- «Случайная» часть - это просто случайное число, сгенерированное с помощью криптографического генератора случайных чисел (для Java это
java.security.SecureRandom
; используйте реализацию «DRBG» вместо «SHA1PRNG», если доступно). Как правило, чем длиннее случайная часть, тем менее предсказуемой она будет.
Ваш текущий код находится на правильном пути, но вы должны объединить две части случайного идентификатора (как они были строками), а не добавлять произвольное смещение к текущему времени (например, что если cal.getTimeInMillis()
возвращает число больше чем Min
?).