Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Ryzyko kolizji UUID przy użyciu różnych algorytmów

Ryzyko kolizji jest nieco podwyższone, ale wciąż znikome. Weź pod uwagę, że:

  • Zarówno grzebień, jak i NEWID /NEWSEQUENTIALID zawierać znacznik czasu z dokładnością do kilku ms. Tak więc, chyba że generujesz dużą liczbę identyfikatorów w dokładnie w tym samym momencie ze wszystkich tych różnych źródeł jest to dosłownie niemożliwe aby identyfikatory się zderzyły.

  • Część identyfikatora GUID, która nie jest na podstawie znacznika czasu może być traktowany jako losowy; większość algorytmów GUID opiera te cyfry na PRNG. W ten sposób prawdopodobieństwo kolizji między tymi innymi 10 bajtami jest w takiej samej kolejności, jak w przypadku użycia dwóch oddzielnych generatorów liczb losowych i obserwowania kolizji.

    Pomyśl o tym przez chwilę - PRNG mogą i powtarzają liczby, więc prawdopodobieństwo kolizji między dwoma z nich nie jest znacząco wyższe niż kolizji przy użyciu tylko jednego z nich, nawet jeśli używają nieco innych algorytmów. To trochę jak granie w te same liczby na loterii co tydzień w przeciwieństwie do wybierania losowego zestawu co tydzień – szanse na wygraną są dokładnie takie same.

Teraz pamiętaj, że gdy używasz algorytmu takiego jak Guid.Comb, masz tylko 10 bitów unikatowego, co odpowiada 1024 oddzielnym wartościom. Jeśli więc generujesz ogromną liczbę identyfikatorów GUID w ciągu tych samych kilku milisekund, będziesz dostać kolizji. Ale jeśli generujesz identyfikatory GUID z dość niską częstotliwością, tak naprawdę nie ma znaczenia, ile różnych algorytmów używasz w tym samym czasie, prawdopodobieństwo kolizji nadal praktycznie nie istnieje.

Najlepszym sposobem na uzyskanie całkowitej pewności jest przeprowadzenie testu; mieć wszystkie 2 lub 3 (lub jakakolwiek ich liczba) generująca identyfikatory GUID w tym samym czasie, w regularnych odstępach czasu i zapisywać je w pliku dziennika, aby sprawdzić, czy występują kolizje (a jeśli tak, to ile). To powinno dać ci dobre wyobrażenie o tym, jak bezpieczne jest to w praktyce.

PS Jeśli używasz generatora grzebieni NHibernate do generowania identyfikatorów GUID dla klastrowanego klucza podstawowego, rozważ użycie NEWSEQUENTIALID() zamiast NEWID() - cały sens Comba polega na unikaniu podziałów stron, a nie osiągniesz tego, jeśli masz inne procesy używające niesekwencyjnych algorytmów. Powinieneś również zmienić dowolny kod za pomocą Guid.NewGuid używać tego samego generatora grzebieniowego - rzeczywisty algorytm grzebieniowy używany w NHibernate nie jest skomplikowany i łatwy do powielenia we własnej logice domeny.

† ​​Zwróć uwagę, że wydaje się, że istnieje pewien spór dotyczący NEWID i czy zawiera znacznik czasu. W każdym razie, ponieważ jest on oparty na adresie MAC, zakres możliwych wartości jest znacznie mniejszy niż GUID V4 lub Comb. Kolejny powód, dla którego zalecam trzymanie się identyfikatorów GUID grzebienia poza bazą danych i NEWSEQUENTIALID wewnątrz bazy danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak naprawić „Opcja konfiguracji „Agent XPs” nie istnieje” w SQL Server (T-SQL)

  2. Nowe funkcje SQL Server 2019

  3. Używanie sp_help_jobschedule w SQL Server

  4. SQL Server 2008 — Pobierz ograniczenia dotyczące tabel

  5. Kiedy muszę używać początku/końca bloków i słowa kluczowego Go w programie SQL Server?