sql >> Databáze >  >> RDS >> Sqlserver

Riziko kolize UUID při použití různých algoritmů

Riziko kolize je mírně zvýšené, ale stále mizivě malé. Zvažte, že:

  • Jak hřeben, tak NEWID /NEWSEQUENTIALID obsahovat časové razítko s přesností na několik ms. Tedy pokud negenerujete velký počet ID v přesně stejný okamžik ze všech těchto různých zdrojů je to doslova nemožné aby se ID srazila.

  • Část GUID, která není na základě časového razítka lze považovat za náhodné; většina algoritmů GUID zakládá tyto číslice na PRNG. Pravděpodobnost kolize mezi těmito dalšími přibližně 10 bajty je tedy ve stejném pořadí, jako kdybyste použili dva samostatné generátory náhodných čísel a sledovali kolize.

    Přemýšlejte o tom chvíli - PRNG mohou a také opakují čísla, takže pravděpodobnost kolize mezi dvěma z nich není výrazně vyšší než kolize s použitím pouze jednoho z nich, i když používají mírně odlišné algoritmy. Je to něco jako hraní stejných čísel v loterii každý týden vs. výběr náhodné sady každý týden – šance na výhru jsou v obou případech naprosto stejné.

Nyní mějte na paměti, že když používáte algoritmus, jako je Guid.Comb, máte pouze 10 bitů unifikátoru, což se rovná 1024 samostatným hodnotám. Pokud tedy generujete velké množství GUID během stejných několika milisekund, budete dostat kolize. Ale pokud generujete GUID s poměrně nízkou frekvencí, nezáleží na tom, kolik různých algoritmů současně používáte, pravděpodobnost kolize stále prakticky neexistuje.

Nejlepší způsob, jak si být naprosto jistý, je provést test; mít všechny 2 nebo 3 (nebo kolik jich používáte) generující GUID současně, v pravidelných intervalech a zapisovat je do souboru protokolu a sledovat, zda nedochází ke kolizi (a pokud ano, kolik). To by vám mělo poskytnout dobrou představu o tom, jak bezpečné je to v praxi.

P.S. Pokud ke generování identifikátorů GUID pro seskupený primární klíč používáte hřebenový generátor NHibernate, zvažte použití NEWSEQUENTIALID() místo NEWID() - smyslem Combu je vyhnout se rozdělení stránek, a toho nedosáhnete, pokud máte jiné procesy využívající nesekvenční algoritmy. Také byste měli změnit jakýkoli kód pomocí Guid.NewGuid použít stejný generátor Comb – skutečný algoritmus Comb použitý v NHibernate není komplikovaný a lze jej snadno duplikovat ve vaší vlastní doménové logice.

† ​​Všimněte si, že se zdá, že existuje spor o NEWID a zda obsahuje časové razítko či nikoli. V každém případě, protože je založen na MAC adrese, rozsah možných hodnot je podstatně menší než V4 GUID nebo Comb. Další důvod, proč doporučuji držet se Comb GUID mimo databázi a NEWSEQUENTIALID uvnitř databáze.



  1. Jak změnit databázi na postgresql pomocí Symfony 2.0?

  2. Nelze propojit postgreSQL s psycopg2

  3. Jak mohu použít hash hesla s PDO, aby byl můj kód bezpečnější?

  4. Databázový model pro rezervační systém autoškoly. Část 1