2010-06-06 10 views
255

Jakie są najlepsze sposoby tworzenia identyfikatora GUID w języku Java?Tworzenie identyfikatora GUID w języku Java

+14

@finneycanhelp - Tak, myślę, że musimy bardziej proste rzeczy, jak to na Stackoverflow, jak również. Wiem, że korzystam z nich znacząco. Problem polega na tym, że ludzie często "płoną" za publikowanie prostych pytań, które są przyjazne dla wyszukiwarek przez osoby, które znają już odpowiedź i uważają, że pytanie jest zbyt proste. Robię to, co właśnie zrobiłeś, kiedy widzę proste pytanie, które ludziom się nie podoba, komentuję na poparcie tego pytania. W tym przypadku jest fajne, że pytanie zostało zamknięte, ponieważ ludzie szukający "GUID Java" go znajdą, a następnie będą mogli zobaczyć odpowiedzi na oba pytania. –

+2

Pytanie na http://stackoverflow.com/questions/325443/generate-uuid-in-java jest bardziej o zderzeniach GUID, a następnie o tym, jak to, co jest równoważne GUID w stosie technologii Java, co jest think) jest bardziej przedmiotem tego pytania. –

Odpowiedz

240

Zapoznaj się z UUID class w pakiecie z Java 5 i nowszymi.

Na przykład:

  • Jeśli chcesz losowy UUID można użyć metody randomUUID.
  • Jeśli chcesz, aby identyfikator UUID został zainicjalizowany do określonej wartości, możesz użyć metody UUID constructor lub fromString.
+2

Jeśli podasz przykład, taki jak Kaleb Brasee, twoja dobra odpowiedź będzie jeszcze lepsza. – Zero3

+0

Działa w AndroidStudio 2.3 i na poziomie API co najmniej 21 i później. Może też z powrotem. – raddevus

288

java.util.UUID.randomUUID();

+29

Podczas gdy brainacs powyżej pisze rozprawy o jakości lub treści pytania, lub podać kilka linków do rozszerzonego czytania na temat pojęcia GUID, ta odpowiedź daje 4 słowa, 3 okresy i oraz nawiasy otwierające i zamykające. Bravo Kaleb. – user1091524

+3

@angel Tak, teoretycznie możliwe jest, aby metoda 'UUID.randomUUID' zwróciła duplikat, ale ** nie jest to w rzeczywistości realna uwaga **. Implementacja Oracle/OpenJDK korzysta z generatora liczb losowych kryptograficznie. Biorąc to pod uwagę i biorąc pod uwagę * zasięg astronomiczny * podany przez tak wiele bitów w UUID, możesz wygenerować wiele milionów takich wartości w swojej aplikacji i nadal dobrze spać. Korzystanie z jednego z pozostałych wariantów jeszcze bardziej zmniejsza możliwość kolizji jeszcze bliższej zeru z powodu użycia "spacji i czasu", [1] adresu MAC lub nazwy oraz [2] bieżącej daty i czasu, jako ograniczeń. –

+0

@RenniePet Eh, jeśli jesteś paranoikiem i masz dostęp do listy już używanych identyfikatorów podczas tworzenia nowego, po prostu generujesz nowe w 'while' dopóki nie dostaniesz tego, którego nie ma w środku twoja lista: p – Nyerguds

26

To zależy jaką UUID chcesz.

  • Standardowe Java UUID klasa wytwarza Version 4 (losowo) UUID. (UPDATE - Version 3 (nazwa) Można również generować identyfikatory UUID). Może również obsługiwać inne warianty, ale nie może ich wygenerować. (W tym przypadku, „uchwyt” oznacza konstrukt UUID wystąpienia z long, byte[] lub String reprezentacji oraz zapewnienie odpowiednich udostępniające).

  • Realizacja Java UUID Generator (JUG) służyć do wspierania „wszystkich typów 3«oficjalnych»z UUID jak określono RFC-4122 "... chociaż RFC w rzeczywistości definiuje 4 typy i wspomina o piątym typie.

Aby uzyskać więcej informacji na temat typów i wariantów UUID, jest dobrym podsumowaniem w Wikipedia, a krwawe szczegóły są w RFC 4122 i innych specyfikacji.

+1

Nie do końca prawda, może również generować identyfikatory UUID oparte na nazwie (wersja 3) z 'UUID.nameUUIDFromBytes (nazwa bajtu [])' –

+0

Poprawiam się.Oparłem się na opisie javadoc, który mówi * "Statyczna fabryka, aby ** pobrać ** UUID typu 3 (bazujący na nazwach) w oparciu o określoną tablicę bajtów." * –

+0

Nie sądzę, że wpis jest dokładny. Dokumenty [UUID Java docs] (https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html) stwierdzają, że konstruktor generuje wariant typu 2, a nie losowy. Dla typu 3 użyj 'public static UUID nameUUIDFromBytes (byte [] name)'. dla typu 4 użyj 'public static UUID randomUUID()'. Typ 1 nie jest dostępny w klasie JDK. – slartibartfast

6

Inne odpowiedzi są poprawne, szczególnie this one przez Stephen C.

Osiągnięcie Poza Java

Generating a UUID wartość ciągu Java jest ograniczona do Version 4 (random) z powodu obaw o bezpieczeństwo.

Jeśli chcesz inne wersje UUID, jedna aleja jest posiadanie aplikacji Java zasięg poza JVM wygenerować UUID dzwoniąc na:

  • wiersza poleceń narzędzie
    pakiecie z prawie każdym systemem operacyjnym .
    Na przykład: uuidgen znalezione w systemie Mac OS X, BSD i Linux.
  • Serwer bazy danych
    Użyj numeru JDBC, aby pobrać identyfikator UUID wygenerowany na serwerze bazy danych.
    Na przykład rozszerzenie uuid-ossp często jest dołączane do Postgres.Że rozszerzenie może generuje wersji 1, 3 i 4 wartości i dodatkowo paru odmianach:
    • uuid_generate_v1mc() - generowanie wersji 1 UUID ale używa losowy adres MAC multicast zamiast prawdziwego adresu MAC komputera.
    • uuid_generate_v5(namespace uuid, name text) - generuje identyfikator UUID w wersji 5, który działa jak identyfikator UUID w wersji 3, z tym wyjątkiem, że SHA-1 jest używana jako metoda mieszania.
  • Web Service
    Na przykład UUID Generator tworzy wersji 1 & 3, jak również nil values i GUID.
+2

Dear Down- Wyborcy: Proszę zostawić krytykę wraz z głosowaniem. Chciałbym wiedzieć, co jest nie tak z tą odpowiedzią, zwłaszcza, że ​​z powodzeniem zastosowałem wszystkie trzy sugerowane rozwiązania w moich własnych aplikacjach Java. –

+0

Nie przesłałem odpowiedzi, ale mam kilka problemów z twoją odpowiedzią: Po pierwsze, już pokazano, że jest źle, że możesz pobrać V4 tylko ze standardowej biblioteki Java (V3 jest również możliwa). Po drugie, wydajesz się brzmieć tak, jakby nie było opcji w Javie poza standardową biblioteką, a także ręcznych "ze względów bezpieczeństwa". I na koniec, po prostu generalnie nieefektywne (programowanie i/lub wydajność) uruchamianie zależy od źródeł zewnętrznych, gdy jest wiele sposobów na to, aby to zrobić w Javie (chyba, że ​​jest to potrzebne, oczywiście, np. Jako element tworzenia rekord w serwerze SQL). –

8

Wystarczy przedłużyć odpowiedź Mark Byers w przykładzie:

import java.util.UUID; 

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

Drodzy głosujący, mógłbyś lepiej wyjaśnić, co jest nie tak z moją odpowiedzią? –

-2

Można użyć tego kodu do wygenerowania GUID.

import java.util.concurrent.TimeUnit; 

import org.apache.log4j.Logger; 

public class StrictMicroSecondTimeBasedGuid 
{ 
    private final static Logger logger = Logger 
      .getLogger(StrictMicroSecondTimeBasedGuid.class); 

    private static final long MICRO_IN_MILL = 1000; 
    private static final long NANO_IN_MICRO = 1000; 

    private static long baseNanoTime; 
    private static long baseTimeInMicro; 
    private static long lastGuid; 

    static 
    { 
     /* 
     * Nanosecond time's reference is not known, therfore following logic is 
     * needed to calculate time in micro without knowing refrence point of 
     * nano time* 
     */ 
     baseNanoTime = System.nanoTime(); 
     baseTimeInMicro = System.currentTimeMillis() * MICRO_IN_MILL; 
     lastGuid = baseTimeInMicro; 
    } 

    public static synchronized Long newGuid() 
    { 
     long newGuid; 

     while ((newGuid = calNewTimeInMicro()) <= lastGuid) 
     { 
      /** we have to check for this log, we don't want to see log. */ 

      logger.debug("wait of 10-microsecond is introduced to get new guid"); 

      try 
      { 
       TimeUnit.MICROSECONDS.sleep(10); 
      } catch (InterruptedException e) 
      { 
       logger.error("Error", e); 
      } 
     } 

     lastGuid = newGuid; 
     return newGuid; 
    } 

    private static long calNewTimeInMicro() 
    { 
     return baseTimeInMicro 
       + ((System.nanoTime() - baseNanoTime)/NANO_IN_MICRO); 
    } 
} 
Powiązane problemy