Prawdopodobieństwo kolizji przy użyciu najbardziej znaczących bitów UUID w Javie

Jeśli używam Long uuid = UUID.randomUUID().getMostSignificantBits() jak prawdopodobne jest, że dojdzie do kolizji. Odcina najmniej znaczące kawałki, więc istnieje możliwość, że wpadniesz w kolizję, prawda?

Author: lospejos, 2008-11-28

5 answers

Zgodnie z dokumentacją, metoda statyczna UUID.randomUUID() generuje UUID typu 4.

Oznacza to, że sześć bitów jest używanych do niektórych informacji o typie, a pozostałe 122 bity są przydzielane losowo.

Sześć losowych bitów jest rozmieszczonych z czterema w najbardziej znaczącej połowie UUID i dwoma w najmniej znaczącej połowie. Tak więc najważniejsza połowa twojego UUID zawiera 60 bitów losowości, co oznacza, że średnio musisz wygenerować 2^30 uuid, aby uzyskać kolizja (w porównaniu do 2^61 dla pełnego UUID).

Więc powiedziałbym, że jesteś raczej bezpieczny. Zauważ jednak, że nie jest to absolutnie prawdą dla innych typów uuid, jak wspomina Carl Seleborg.

Nawiasem mówiąc, byłoby ci nieco lepiej, używając najmniej znaczącej połowy UUID (lub po prostu generując losowy długi za pomocą SecureRandom).

 214
Author: Rasmus Faber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-17 07:08:32

Raymond Chen ma naprawdę doskonały wpis na blogu na ten temat:

GUID są unikalne globalnie, ale podciągi GUID nie są

 57
Author: Carl Seleborg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-22 08:04:12

Uważam, że jest to najlepszy przykład użycia randomUUID :

Http://www.javapractices.com/topic/TopicAction.do?Id=56

 13
Author: Kannika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-15 10:02:29

Lepiej jest po prostu wygenerować losową długą wartość, wtedy wszystkie bity są losowe. W Javie 6 system wykorzystuje new Random ().nanoTime () plus licznik jako zalążek.

Istnieją różne poziomy wyjątkowości.

Jeśli potrzebujesz wyjątkowości na wielu maszynach, możesz mieć centralną tabelę bazy danych do przydzielania unikalnych identyfikatorów, a nawet partii unikalnych identyfikatorów.

Jeśli potrzebujesz tylko mieć unikalność 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ń)

 10
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 21:36:17

Użyj czasu YYYYDDDD (Rok + Dzień roku) jako prefiksu. Zmniejsza to fragmentację bazy danych w tabelach i indeksach. Ta metoda zwraca byte[40]. Używałem go w środowisku hybrydowym, gdzie Active Directory SID (varbinary(85)) jest kluczem dla użytkowników LDAP, a aplikacja automatycznie wygenerowana ID jest używana dla użytkowników spoza LDAP. Również duża liczba transakcji dziennie w tabelach transakcyjnych (branża bankowa) nie może używać standardowych typów Int dla kluczy

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();
}
 7
Author: Dr Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-03 00:57:37