Створіть GUID на Java


377

Які є найкращі способи створення GUID на Java?


3
Питання на stackoverflow.com/questions/325443/generate-uuid-in-java стосується більше зіткнень GUID, а потім того, як еквівалент GUID є в технічному стеку Java, що саме (я думаю) більше фокус цього питання.
Джон Адамс

Відповіді:


347

Погляньте на клас UUID, що постачається з Java 5 та пізнішими версіями.

Наприклад:

  • Якщо потрібно випадковий UUID, ви можете скористатися методом randomUUID .
  • Якщо ви хочете, щоб UUID ініціалізувався до певного значення, ви можете використовувати конструктор UUID або метод fromString .

7
Якщо ви додасте такий приклад, як це зробив Калеб Брейзе, ваша хороша відповідь буде ще кращою.
Нуль3

Працює в AndroidStudio 2.3 і на рівнях API 21 і менше. Можливо, ще й назад.
raddevus

5
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger

419

java.util.UUID.randomUUID();


2
міг би це повернути повторення? тому що Гід ніколи не збирається повторюватися
ангел

4
@angel Так, UUID.randomUUIDметодом теоретично можливо повернути дублікат, але це зовсім не є реальною проблемою . В реалізації Oracle / OpenJDK використовується криптографічно сильний генератор випадкових чисел. Враховуючи це, і враховуючи астрономічний діапазон, що задається стільки бітами в UUID, ви можете генерувати багато мільйонів таких значень у вашій програмі і все ще спати добре. Використання одного з інших варіантів додатково зменшує можливість зіткнень ще ближче до нуля через використання "простору та часу", [1] MAC-адреси чи імені та [2] поточного дати-часу як обмеження.
Василь Бурк

@ RenniePet Ех, якщо ви такий параноїк, і ви отримали доступ до списку вже використаних ідентифікаторів під час створення нового, ви просто генеруєте нові, whileпоки ви не отримаєте той, який не знаходиться у вашому списку: p
Nyerguds

2
Генератор криптових випадкових чисел Oracle, як правило, є PRNG із випадковим насінням. Випадкове насіння зазвичай отримують з використанням джерела "ентропії", наданого ОС. Якщо ви можете погіршити або компрометувати це джерело, тоді ймовірність генератора крипто-випадкових чисел виробити одне і те ж число збільшується. Варто також зазначити, що на деяких (наприклад, віртуалізованих) платформах ОС може закінчитися ентропією. Існують "хитрі хакі", щоб вирішити це, але вони тягнуть за собою погіршення якості ентропії.
Стівен С

Це не просто академічне питання. Я бачив ( неперевірений !! ) стверджує , що хто - то зробили зіткнеться з проблемами зі випадковим на основі UUID , не є унікальним.
Стівен С

32

Це залежить від того, який тип UUID ви хочете.

  • Стандартний UUIDклас Java генерує UUID версії 4 (випадкові). ( ОНОВЛЕННЯ - Версія 3 (ім'я) UUID можуть також генеруватися.) Він також може обробляти інші варіанти, хоча не може їх генерувати. (В цьому випадку, «ручка» кошти конструкту UUIDекземпляри з long, byte[]або Stringуявлення, і пропонують деякі відповідні аксессор.)

  • Реалізація Java UUID Generator (JUG) передбачає підтримку "всіх 3" офіційних "типів UUID, як визначено RFC-4122 " ... хоча RFC насправді визначає 4 типи і згадує 5 тип.

Для отримання додаткової інформації про типи та варіанти UUID, ви знайдете хороший підсумок у Вікіпедії , а деталі горі - у RFC 4122 та інших специфікаціях.


1
Не зовсім правда, вона також може генерувати UUID на основі імен (версія 3) зUUID.nameUUIDFromBytes(byte[] name)
DennisK

Я стою виправлений. Я покладався на опис javadoc, який говорить "Статична фабрика для отримання UUID типу 3 (на основі імені) на основі заданого масиву байтів".
Stephen C

Я не вважаю, що публікація є точною. У документах UUID Java документи конструктор генерує варіант типу 2, а не випадковий. Для використання типу 3 public static UUID nameUUIDFromBytes(byte[] name). для використання типу 4 public static UUID randomUUID(). Тип 1 недоступний для класу JDK.
slartibartfast

Ні. Я думаю, що я це зрозумів. Javadocs зазначає: "хоча конструктори дозволяють створювати будь-який варіант UUID (описаний нижче)." і 4 варіанти перераховані нижче, включаючи тип 1. Дійсно, читайте javadoc дляclockSequence()
Stephen C

27

Просто, щоб продовжити відповідь Марка Байєрса прикладом:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

Інші відповіді правильні, особливо це одна від Stephen C .

Досягнення зовнішньої Яви

Генерування значення UUID в Java обмежується версією 4 (випадково) через проблеми безпеки.

Якщо ви хочете отримати інші версії UUID, одним із проспектів є те, щоб ваша програма Java вийшла за межі JVM для створення UUID, зателефонувавши:

  • Утиліта командного рядка
    У комплекті майже з кожною операційною системою.
    Наприклад, uuidgenзустрічається в Mac OS X, BSD та Linux.
  • Сервер бази даних
    Використовуйте JDBC для отримання UUID, сформованого на сервері баз даних.
    Наприклад, uuid-osspрозширення часто поставляється в комплекті з Postgres . Це розширення може генерувати значення версій 1, 3 та 4 та додатково декілька варіацій:
    • uuid_generate_v1mc() - генерує UUID версії 1, але використовує випадкову MAC-адресу багатосторонніх даних замість реальної MAC-адреси комп’ютера.
    • uuid_generate_v5(namespace uuid, name text) - створює UUID версії 5, яка працює як UUID версії 3, за винятком того, що SHA-1 використовується як метод хешування.
  • Веб-сервіс
    Наприклад, UUID Generator створює версії 1 і 3, а також нульові значення та GUID .

3
У мене є деякі проблеми з вашою відповіддю: По-перше, було показано, що це неправильно, що ви можете отримати V4 лише зі стандартної бібліотеки Java (V3 також можливий). По-друге, вам здається, що в Java немає жодних параметрів, окрім стандартної бібліотеки, а також хвилеподібної рукою "через проблеми безпеки". І, нарешті, просто неефективно (програмування та / або продуктивність) починати залежно від зовнішніх джерел, коли існує багато способів зробити це в межах Java (якщо, звичайно, це не потрібно в тих, наприклад, як частина створення запис на SQL-сервер).
DennisK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.