Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

UUID-Kollisionsrisiko unter Verwendung verschiedener Algorithmen

Das Kollisionsrisiko ist leicht erhöht, aber immer noch verschwindend gering. Bedenken Sie Folgendes:

  • Sowohl Comb als auch NEWID /NEWSEQUENTIALID enthalten einen Zeitstempel mit einer Genauigkeit von wenigen ms. Es sei denn, Sie generieren eine große Anzahl von IDs zum genau gleichen Zeitpunkt aus all diesen verschiedenen Quellen ist es buchstäblich unmöglich für IDs kollidieren.

  • Der Teil der GUID, der nicht ist basierend auf dem Zeitstempel kann als zufällig angesehen werden; Die meisten GUID-Algorithmen basieren diese Ziffern auf einem PRNG. Daher ist die Wahrscheinlichkeit einer Kollision zwischen diesen anderen 10 Bytes etwa in der gleichen Größenordnung, als ob Sie zwei separate Zufallszahlengeneratoren verwenden und auf Kollisionen achten würden.

    Denken Sie einen Moment darüber nach - PRNGs können Zahlen wiederholen und tun dies auch, daher ist die Wahrscheinlichkeit einer Kollision zwischen zwei von ihnen nicht wesentlich höher als eine Kollision mit nur einem von ihnen, selbst wenn sie leicht unterschiedliche Algorithmen verwenden. Es ist so, als würde man jede Woche die gleichen Lottozahlen spielen oder jede Woche einen zufälligen Satz auswählen - die Gewinnchancen sind in beiden Fällen genau gleich.

Denken Sie jetzt daran, dass Sie bei Verwendung eines Algorithmus wie Guid.Comb nur 10 Bits an Uniqueifier haben, was 1024 separaten Werten entspricht. Wenn Sie also innerhalb derselben wenigen Millisekunden eine große Anzahl von GUIDs generieren, werden Sie Kollisionen bekommen. Aber wenn Sie GUIDs mit einer ziemlich niedrigen Frequenz generieren, spielt es keine Rolle, wie viele verschiedene Algorithmen Sie gleichzeitig verwenden, die Wahrscheinlichkeit einer Kollision ist immer noch praktisch nicht vorhanden.

Um absolut sicher zu sein, führen Sie am besten einen Test durch. Lassen Sie alle 2 oder 3 (oder wie viele Sie auch verwenden) in regelmäßigen Abständen gleichzeitig GUIDs generieren und schreiben Sie sie in eine Protokolldatei, und sehen Sie, ob Sie Kollisionen erhalten (und wenn ja, wie viele). Das sollte Ihnen eine gute Vorstellung davon geben, wie sicher dies in der Praxis ist.

P.S. Wenn Sie den Kammgenerator von NHibernate verwenden, um GUIDs für einen gruppierten Primärschlüssel zu generieren, sollten Sie die Verwendung von NEWSEQUENTIALID() in Betracht ziehen statt NEWID() - Der ganze Sinn von Comb besteht darin, Seitenaufteilungen zu vermeiden, und Sie erreichen dies nicht, wenn Sie andere Prozesse haben, die nicht sequentielle Algorithmen verwenden. Sie sollten auch jeden Code mit Guid.NewGuid ändern um denselben Comb-Generator zu verwenden - der eigentliche Comb-Algorithmus, der in NHibernate verwendet wird, ist nicht kompliziert und einfach in Ihrer eigenen Domänenlogik zu duplizieren.

† ​​Beachten Sie, dass es anscheinend Streit um NEWID gibt , und ob es einen Zeitstempel enthält oder nicht. Da es auf der MAC-Adresse basiert, ist der Bereich der möglichen Werte in jedem Fall erheblich kleiner als bei einer V4-GUID oder einem Comb. Ein weiterer Grund für mich zu empfehlen, sich an Comb GUIDs außerhalb der Datenbank und NEWSEQUENTIALID zu halten innerhalb der Datenbank.