Відповіді:
Згідно з документацією , статичний метод UUID.randomUUID()
генерує UUID типу 4.
Це означає, що шість бітів використовуються для деякої інформації типу, а решта 122 біт призначаються випадковим чином.
Шість випадкових бітів розподіляються чотирма в найбільш значущій половині UUID і двома в найменш значній половині. Отже, найзначніша половина вашого UUID містить 60 біт випадковості, що означає, що вам потрібно в середньому генерувати 2 ^ 30 UUID, щоб отримати зіткнення (порівняно з 2 ^ 61 для повного UUID).
Тому я б сказав, що ви досить безпечні. Зауважте, однак, що це абсолютно не вірно для інших типів UUID, як зазначає Карл Селеборг.
До речі, вам було б трохи краще, використовуючи щонайменше значну половину UUID (або просто генеруючи випадковий довгий за допомогою SecureRandom).
У Реймонда Чена є справді чудова публікація в цьому блозі:
Я думаю, що це найкращий приклад використання randomUUID:
Вам краще просто генерувати випадкове довге значення, тоді всі біти є випадковими. У Java 6 новий Random () використовує System.nanoTime () плюс лічильник як насіння.
Існують різні рівні унікальності.
Якщо вам потрібна унікальність на багатьох машинах, ви можете мати центральну таблицю бази даних для розподілу унікальних ідентифікаторів або навіть партій унікальних ідентифікаторів.
Якщо вам просто потрібно мати унікальність в одному додатку, ви можете просто мати лічильник (або лічильник, який починається з currentTimeMillis () * 1000 або nanoTime () залежно від ваших вимог)
Використовуйте YYYYDDDD
як префікс час (рік + день року). Це зменшує фрагментацію бази даних у таблицях та індексах. Цей метод повертається byte[40]
. Я використовував його в гібридному середовищі, де Active Directory SID ( varbinary(85)
) є ключем для користувачів LDAP, а ідентифікований автоматично створений програмою ідентифікатор використовується для користувачів, які не є LDAP. Також велика кількість транзакцій на день у транзакційних таблицях (банківська індустрія) не може використовувати стандартні Int
типи для ключів
private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");
public static byte[] getSidWithCalendar() {
Calendar cal = Calendar.getInstance();
String val = String.valueOf(cal.get(Calendar.YEAR));
val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
val += UUID.randomUUID().toString().replaceAll("-", "");
return val.getBytes();
}