sql >> Database >  >> RDS >> Sqlserver

UUID-botsingsrisico met verschillende algoritmen

Het risico op aanrijdingen is iets verhoogd, maar nog steeds verwaarloosbaar klein. Bedenk dat:

  • Zowel Comb als NEWID /NEWSEQUENTIALID een tijdstempel opnemen met een precisie tot op enkele ms. Dus, tenzij u een groot aantal ID's genereert op exact hetzelfde moment van al deze verschillende bronnen is het letterlijk onmogelijk om ID's te laten botsen.

  • Het deel van de GUID dat niet . is op basis van de tijdstempel kan als willekeurig worden beschouwd; de meeste GUID-algoritmen baseren deze cijfers op een PRNG. De kans op een botsing tussen deze andere 10 bytes of zo is dus in dezelfde volgorde als wanneer u twee afzonderlijke generatoren voor willekeurige getallen gebruikt en op botsingen let.

    Denk hier eens over na - PRNG's kunnen en zullen getallen herhalen, dus de kans op een botsing tussen twee van hen is niet significant groter dan een botsing met slechts één van hen, zelfs als ze iets andere algoritmen gebruiken. Het is net alsof je elke week dezelfde lotnummers speelt versus elke week een willekeurige set kiest - de kansen om te winnen zijn hoe dan ook precies hetzelfde.

Houd er rekening mee dat wanneer u een algoritme zoals Guid.Comb gebruikt, u slechts 10 bits unicifier hebt, wat overeenkomt met 1024 afzonderlijke waarden. Dus als u binnen dezelfde paar milliseconden een enorm aantal GUID's genereert, zal botsingen krijgen. Maar als je GUID's met een vrij lage frequentie genereert, maakt het niet zoveel uit hoeveel verschillende algoritmen je tegelijkertijd gebruikt, de kans op een botsing is nog steeds praktisch onbestaande.

De beste manier om absoluut zeker te zijn, is door een test uit te voeren; laat alle 2 of 3 (of hoeveel je er ook gebruikt) GUID's genereren, op hetzelfde moment, met regelmatige tussenpozen, en schrijf ze naar een logbestand, en kijk of je botsingen krijgt (en zo ja, hoeveel). Dat zou je een goed idee moeten geven van hoe veilig dit in de praktijk is.

PS Als u de kamgenerator van NHibernate gebruikt om GUID's voor een geclusterde primaire sleutel te genereren, kunt u overwegen NEWSEQUENTIALID() te gebruiken in plaats van NEWID() - het hele punt van Comb is om paginasplitsingen te voorkomen, en dat bereik je niet als je andere processen hebt die niet-sequentiële algoritmen gebruiken. U moet ook elke code wijzigen met Guid.NewGuid om dezelfde Comb-generator te gebruiken - het eigenlijke Comb-algoritme dat in NHibernate wordt gebruikt, is niet ingewikkeld en gemakkelijk te dupliceren in uw eigen domeinlogica.

† ​​Merk op dat er enige onenigheid lijkt te zijn over NEWID , en of het al dan niet een tijdstempel bevat. Hoe dan ook, aangezien het gebaseerd is op het MAC-adres, is het bereik van mogelijke waarden aanzienlijk kleiner dan een V4-GUID of een Comb. Nog een reden voor mij om aan te bevelen om bij Comb GUID's buiten de database te blijven en NEWSEQUENTIALID in de database.



  1. Wat is de volgorde van records in een tabel met een samengestelde primaire sleutel

  2. Hoe een CSV-bestand in een MySQL-tabel te importeren

  3. Waarom retourneert CONNECT BY LEVEL op een tafel extra rijen?

  4. Moet de gemiddelde verwerkingstijd vinden tussen alle tijdstempelrecords in Oracle SQL