tipo generate generar dato convert sql-server guid

sql server - generate - ¿Son posibles las colisiones GUID?



tipo de dato uniqueidentifier sql server (16)

¿Podría el código utilizado para generar un GUID tener un error en él? Sí, por supuesto que podría. Pero la respuesta es la misma que sería para un error del compilador: su propio código tiene órdenes de magnitud más propensas a fallar, así que primero mire allí.

Estoy trabajando en una base de datos en SQL Server 2000 que usa un GUID para cada usuario que usa la aplicación a la que está vinculado. De alguna manera, dos usuarios terminaron con el mismo GUID. Sé que Microsoft utiliza un algoritmo para generar un GUID aleatorio que tiene una posibilidad extremadamente baja de causar colisiones, pero ¿es posible una colisión?


Básicamente no son posibles! , las posibilidades son astronómicamente bajas .

Pero ... Soy la única persona del mundo que conozco, que tuvo una colisión GUID una vez (¡sí!).

Y estoy seguro de eso, y que no fue un error.

Cómo sucedió, en una pequeña aplicación que se ejecutaba en Pocket PC, al final de una operación debe emitirse un comando que tiene un GUID generado. El comando después de que se ejecutó en el servidor se almacenó en una tabla de comandos en el servidor junto con la fecha de ejecución. Un día, cuando estaba depurando, emití el comando del módulo (con el GUID recién generado adjunto) y no pasó nada. Lo hice de nuevo (con el mismo guid, porque el guid se generó una sola vez al comienzo de la operación), y de nuevo, y nada, finalmente tratando de averiguar por qué el comando no se está ejecutando, revisé la tabla de comandos, y el mismo GUID que el actual se insertó hace 3 semanas. No creyendo esto, restauré una base de datos de 2 semanas de respaldo, y el guid estaba allí. Comprueba el código, el nuevo guid fue generado recientemente sin ninguna duda al respecto. La colisión Pow Pow, sucedió solo una vez, pero realmente desearía haber ganado en lotería, la posibilidad es mayor :).

Editar: hay algunos factores que podrían haber aumentado las posibilidades de que esto ocurriera, la aplicación se ejecutaba en el emulador de PocketPC y el emulador tiene una función de guardar estado, lo que significa que cada vez que se restaura el estado, también se restaura la hora local. y el guid se basa en el temporizador interno ... también el algoritmo de generación de guid para el marco compacto podría ser menos completo que, por ejemplo, el COM ...


Básicamente, no. Creo que alguien se metió con tu base de datos. Dependiendo de la versión GUID que esté usando, el valor es único (para cosas como GUID versión 1), o como único e impredecible (para cosas como GUID versión 4). La implementación de SQL Server para su función NEWID () parece usar un número aleatorio de 128 bits, por lo que no se producirá una colisión.

Para una probabilidad del 1% de colisión, necesitaría generar aproximadamente 2,600,000,000,000,000,000 GUID.


Claro que es posible, y tal vez incluso probable. No es como si cada GUID estuviera en una porción aleatoria del espacio de número posible. En el caso de que dos hilos intentaran generar uno simultáneamente, salvo algún tipo de función GUID centralizada con un semáforo a su alrededor, podrían terminar con el mismo valor.


Consideraría la navaja de Occam como una buena guía en este caso. Es increíblemente poco probable que tengas una colisión GUID. Es mucho más probable que tenga un error, o que alguien esté jugando con sus datos.


Dos máquinas Win95 que tienen tarjetas ethernet con direcciones MAC duplicadas emitirán GUIDS duplicados bajo condiciones estrictamente controladas, especialmente si, por ejemplo, la energía se apaga en el edificio y ambos arrancan exactamente al mismo tiempo.


En teoría son posibles, pero con números posibles de 3.4E38, si crea decenas de billones de GUID en un año, la posibilidad de tener un duplicado es 0.00000000006 ( Source ).

Si dos usuarios terminaron con el mismo GUID, apostaría a que hay un error en el programa que está causando que los datos se copien o compartan.


Es muy poco probable que se encuentre con colisiones de GUID si las está generando a través de algo como la función NEWID() en SQL Server (aunque, por supuesto, es posible, ya que otras respuestas se han enfatizado). Una cosa que no han señalado es que es bastante probable que te encuentres con colisiones si estás generando GUID en JavaScript en buscadores en la naturaleza. No solo a veces hay problemas en el RNG en diferentes navegadores, sino que también he tenido problemas donde las arañas de Google parecen almacenar en caché los resultados de funciones como esa, y terminé pasando repetidamente el mismo GUID a nuestros sistemas.

Vea las diversas respuestas aquí para más detalles:

Colisiones al generar UUID en JavaScript?


Imposible si los usuarios tienen diferentes máquinas con tarjetas de red, e incluso si no es todavía un riesgo extremadamente marginal casi teórico.

Personalmente, buscaría en otro lado ya que es más probable un error en lugar de un choque GUID ...

Proporcionando, por supuesto, que no corte bits del GUID para hacerlo más corto.


Las posibilidades de que dos GUID aleatorios colisionen (~ 1 en 10 ^ 38) son menores que la posibilidad de no detectar un paquete TCP / IP corrupto (~ 1 en 10 ^ 10). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf , página 11. Esto también se aplica a las unidades de disco, unidades de CD, etc.

Los GUID son estadísticamente únicos y los datos que usted lee de la base de datos son estadísticamente correctos.


Por supuesto que es posible ... ¿Probable? No es probable, pero es posible.

Recuerde, la misma máquina genera cada GUID (el servidor), por lo que se pierde gran parte de la "aleatoriedad" que se basa en la información específica de la máquina.


Primero veamos la posibilidad de colisión de dos GUID. No es, como han indicado otras respuestas, 1 en 2 ^ 128 (10 ^ 38) debido a la paradoja del cumpleaños , lo que significa que para un 50% de probabilidad de que dos GUID colisionen la probabilidad es realmente 1 en 2 ^ 64 (10 ^ 19) que es mucho más pequeño. Sin embargo, este sigue siendo un número muy grande, y como tal, la probabilidad de colisión suponiendo que está utilizando un número razonable de GUID es baja.

Tenga en cuenta también que los GUID no contienen una marca de tiempo o MAC como mucha gente parece creer. Esto fue cierto para los GUID v1, pero en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm que significa que la posibilidad de colisión es posiblemente más alta porque ya no son exclusivos de un tiempo y una máquina.

Entonces, esencialmente, la respuesta es sí, las colisiones son posibles. Pero son muy poco probables.

Editar: arreglado para decir 2 ^ 64


Sé que a la gente le gusta la respuesta positiva de que los GUID son mágicos y se garantiza que son únicos, pero en realidad, la mayoría de los GUID son solo números aleatorios de 121 bits (siete de los bits se desperdician en el formateo). Si no se siente cómodo usando un gran número aleatorio, entonces no debe sentirse cómodo usando un GUID.


Solo por sonrisas, prueba la siguiente secuencia de comandos ... (funciona en SQL 2005, no estoy seguro acerca de 2000)

declare @table table ( column1 uniqueidentifier default (newid()), column2 int, column3 datetime default (getdate()) ) declare @counter int set @counter = 1 while @counter <= 10000 begin insert into @table (column2) values (@counter) set @counter = @counter + 1 end select * from @table select * from @table t1 join @table t2 on t1.column1 = t2.column1 and t1.column2 != t2.column2

Ejecutar esto repetidamente (lleva menos de un segundo) produce un rango bastante amplio desde la primera selección, incluso con un espacio de tiempo EXTREMADAMENTE corto. Hasta ahora, el segundo select no ha producido nada.


Vea el artículo del identificador único global de Wikipedia. Hay varias formas de generar GUID. Aparentemente, la antigua (?) Forma utilizaba la dirección Mac, una marca de tiempo hasta una unidad muy corta y un contador único (para administrar generaciones rápidas en la misma computadora), por lo que duplicarlos es casi imposible. Pero estos GUID se descartaron porque podrían usarse para rastrear usuarios ...

No estoy seguro del nuevo algoritmo utilizado por Microsoft (el artículo dice que una secuencia de GUID puede predecirse, parece que ya no usan la marca de tiempo) El artículo de Microsoft vinculado anteriormente dice algo más ...).

Ahora, los GUID están cuidadosamente diseñados para ser, por nombre, globalmente únicos, así que me arriesgaré a que sea imposible, o de muy poca probabilidad. Me gustaría buscar en otro lado.


Voy a prolocar esto con "No soy una persona de networking, por lo que puedo seguir frases completamente incoherentes".

Cuando trabajé en la Universidad Estatal de Illinois, teníamos dos computadoras de escritorio Dell, ordenadas en diferentes momentos. Pusimos el primero en la red, pero cuando intentamos poner el segundo en la red comenzamos a recibir errores locos. Después de mucha resolución de problemas, se determinó que ambas máquinas producían el mismo GUID (no estoy seguro de para qué, pero las hizo inutilizables en la red). Dell realmente reemplazó ambas máquinas como defectuosas.