Tengo una base de datos donde 2 (o tal vez 3 o 4) diferentes aplicaciones son la inserción de la información. La nueva información ha Identificadores de tipo GUID/UUID, pero cada aplicación utiliza un algoritmo diferente para generar el Id. Por ejemplo, uno es el uso de la NHibernate «guid.el peine», otra es mediante el SQLServer del NEWID(), otros quizás desee utilizar .NETO del Guid.NewGuid() implementación.

Hay una por encima de lo normal riesgo de ID de colisión o duplicados?

Gracias!

InformationsquelleAutor Diego Jancic | 2010-06-14

2 Comentarios

  1. 22

    El riesgo de colisiones se eleva ligeramente, pero todavía muy pequeña. Tener en cuenta que:

    • Tanto Peine y NEWID/NEWSEQUENTIALID incluir una marca de tiempo con precisión de hasta unos pocos ms. Por lo tanto, a menos que usted está generando un gran número de identificación en la mismo momento en el tiempo de todas estas diferentes fuentes, es literalmente imposible para los Identificadores de colisión.

    • La parte de el GUID que no basado en la marca de tiempo puede ser pensado como al azar; la mayoría de los GUID de los algoritmos de la base de estas cifras en un PRNG. Por lo tanto, la probabilidad de una colisión entre estos otros 10 bytes o lo es en el mismo orden que si usted utiliza dos separar a los generadores de números aleatorios y vio a colisiones.

      Pensar en esto por un momento – PRNGs puede y no repetir los números, por lo que la probabilidad de una colisión entre dos de ellos no es significativamente superior a la de una colisión utilizando sólo uno de ellos, incluso si utilizan algoritmos levemente diferentes. Es algo así como jugar los mismos números de la lotería cada semana vs escoger un conjunto aleatorio cada semana, las probabilidades de ganar son exactamente los mismos en ambos sentidos.

    Ahora, ten en cuenta que cuando se utiliza un algoritmo como el Guid.Peine, usted sólo tiene 10 bits de unicidad, lo que equivale a 1024 valores independientes. Así que si usted está generando un gran número de Guid dentro de la misma de unos milisegundos, se obtener las colisiones. Pero si generar Guid en una muy baja frecuencia, que en realidad no importa cómo muchos algoritmos diferentes de utilizar, al mismo tiempo, la probabilidad de una colisión es prácticamente inexistente.

    La mejor manera de estar absolutamente seguro es ejecutar una prueba; tiene todos los 2 o 3 (o sin embargo muchos de los que uso) la generación de Guid, al mismo tiempo, a intervalos regulares, y los escribe en un archivo de registro, y a ver si consiguen colisiones (y si es así, ¿cuántos). Esto te dará una buena idea de cómo la caja fuerte esto es en la práctica.

    P. S. Si usted está usando NHibernate peine generador para generar Guid para un clúster de clave principal, considere el uso de NEWSEQUENTIALID() en lugar de NEWID() – el punto de Peine es para evitar la división de la página, y usted no lleva a cabo que si usted tiene otros procesos, utilizando la no-secuencial de los algoritmos. También debe cambiar cualquier código utilizando Guid.NewGuid a utilizar el mismo Peine generador – el real Peine algoritmo utilizado en NHibernate es no es complicado y fácil de duplicar en su propia lógica de dominio.

    † Nota que parece que hay cierta controversia acerca de NEWID, y si es o no contiene una marca de tiempo. En cualquier caso, ya que se basa en la dirección MAC, el rango de valores posibles es considerablemente más pequeño que un V4 GUID o un Peine. Razón de más para que me recomienda apegarse a Peine Guid fuera de la base de datos y NEWSEQUENTIALID dentro de la base de datos.

    • Mientras yo (en su mayoría) de acuerdo con su conclusión, debo señalar varios errores. NEWID no incluir una marca de tiempo; y la fecha y hora de NEWSEQUENTIALID y Peine se almacenan en diferentes bytes, por lo que puede obtener las colisiones de los «Guid» generada en diferentes tiempos. También, GUID que el uso de marcas de tiempo (tales como NEWSEQUENTIALID) hacer no rellene el resto con PRNG números; el uso de la dirección MAC. Es por eso que me sugirió la estandarización en una sola Guid algoritmo de generación.
    • Yo no puedo probar o refutar que NEWID es la marca de tiempo, ya que la documentación es escasa, pero AFAIK se basa en la V1 de la GUID algoritmo que hace uso de una marca de tiempo. Y la marca de hora bytes para Peinar y NEWSEQUENTIALID debe ser el mismo bytes, de lo contrario realidad no iba a ser secuenciales. (Se utilizan diferentes tamaños de la marca de tiempo, sí, pero el de menor tamaño es de 10 bytes y por lo que el resultado será todavía colisiones para la inserción de las frecuencias por debajo de 3.33 ms).
    • De todos modos, he añadido un descargo de responsabilidad, independientemente de cómo NEWID() en realidad genera su ID, es mejor usar NEWSEQUENTIALID en el servidor si usted planea usar Peines en el cliente.
    • NEWID es un RFC4122 V4 GUID (completamente al azar, excepto para los 6 bits que hacen RFC4122-compatible). NEWSEQUENTIALID es una V1 GUID pero swaps de muchos de sus bytes para dar cuenta de SQL Server loco pedido de Guid. Mientras NEWSEQUENTIALID Guid son, de hecho, secuencial, Peine Guid menudo son no. La no utilización de los mismos bytes por su hora; NEWSEQUENTIALID Guid tienen marcas de tiempo en su primer grupo, sin embargo, Peine Guid lugar en el grupo. Consulte los vínculos en la mi blog para los detalles escabrosos.
    • «10 bytes de unicidad, lo que equivale a 1024 valores independientes» que significa bits.
    • Gracias por las capturas @cdiggins.

  2. 4

    Sí, el riesgo está por encima de lo normal, debido a que todos estos utilizan diferentes definiciones de «GUID.» Guid.NewGuid() es compatible con RFC en su mayoría-GUID aleatorio, pero NEWSEQUENTIALID es un reordenar (y por lo tanto no cumple con RFC) GUID basado en la dirección MAC y la marca de tiempo, y NHibernate peine GUID es completamente diferente (basado en la aleatoriedad y la marca de tiempo).

    Puede que desee considerar la estandarización en un GUID de la aplicación. Puedo usar mi propio tipo de peinado GUID para todas mis aplicaciones. Mi blog tiene una breve descripción de todos estos tipos de Guid, junto con las decisiones de diseño para mi.

Dejar respuesta

Please enter your comment!
Please enter your name here