Jeśli używam, jakie Long uuid = UUID.randomUUID().getMostSignificantBits()
jest prawdopodobieństwo kolizji. Odcina najmniej znaczące bity, więc istnieje możliwość, że wpadniesz na kolizję, prawda?
Zgodnie z dokumentacją metoda statyczna UUID.randomUUID()
generuje UUID typu 4.
Oznacza to, że dla niektórych informacji o typie używanych jest sześć bitów, a pozostałe 122 bity są przypisywane losowo.
Sześć bitów nielosowych jest rozdzielonych, z czterema w najbardziej znaczącej połowie UUID i dwoma w najmniej znaczącej połowie. Więc najbardziej znacząca połowa twojego UUID zawiera 60 bitów losowości, co oznacza, że średnio musisz wygenerować 2 ^ 30 UUID, aby uzyskać kolizję (w porównaniu do 2 ^ 61 dla pełnego UUID).
Powiedziałbym więc, że jesteś raczej bezpieczny. Należy jednak pamiętać, że absolutnie nie jest to prawdą w przypadku innych typów UUID, jak wspomina Carl Seleborg.
Nawiasem mówiąc, byłoby nieco lepiej, używając najmniej znaczącej połowy identyfikatora UUID (lub po prostu generując losową długość za pomocą SecureRandom).
Raymond Chen ma naprawdę świetny post na blogu na ten temat:
Identyfikatory GUID są unikalne na całym świecie, ale podciągi identyfikatorów GUID nie są
źródło
Myślę, że to najlepszy przykład użycia randomUUID:
http://www.javapractices.com/topic/TopicAction.do?Id=56
źródło
Lepiej jest po prostu wygenerować losową długą wartość, wtedy wszystkie bity są losowe. W Javie 6 nowy Random () używa System.nanoTime () plus licznika jako ziarna.
Istnieją różne poziomy wyjątkowości.
Jeśli potrzebujesz wyjątkowości na wielu komputerach, możesz mieć centralną tabelę bazy danych do przydzielania unikalnych identyfikatorów, a nawet partii niepowtarzalnych identyfikatorów.
Jeśli potrzebujesz tylko wyjątkowości w jednej aplikacji, możesz po prostu mieć licznik (lub licznik, który zaczyna się od currentTimeMillis () * 1000 lub nanoTime () w zależności od Twoich wymagań)
źródło
Użyj
YYYYDDDD
prefiksu Czas (rok + dzień roku). Zmniejsza to fragmentację bazy danych w tabelach i indeksach. Ta metoda zwracabyte[40]
. Użyłem go w środowisku hybrydowym, w którym SID (varbinary(85)
) usługi Active Directory jest kluczem dla użytkowników LDAP, a dla użytkowników innych niż LDAP używany jest automatycznie wygenerowany identyfikator aplikacji. Również duża liczba transakcji dziennie w tabelach transakcyjnych (sektor bankowy) nie może używać standardowychInt
typów kluczyźródło