2012-02-17 14 views
12

Tengo curiosidad, siempre me he preguntado por qué es así.Servidor SQL: ¿por qué el 15º carácter de un GUID siempre es 4?

En un intento de averiguar si podía crear uno sin el carácter 4 en el carácter número 15, me encontré con esto ...

DECLARE @GUID AS NVARCHAR(36) 
DECLARE @COUNT AS INTEGER 

SET @COUNT = 0 
SET @GUID = CAST(NEWID() AS NVARCHAR(36)) 

WHILE SUBSTRING(@GUID,15,1) = '4' 
BEGIN 
    SET @COUNT = @COUNT + 1 
    SET @GUID = CAST(NEWID() AS NVARCHAR(36)) 
END 

PRINT 'Attempts : ' + CAST(@COUNT AS NVARCHAR(MAX)) 
PRINT @GUID 

Como se puede adivinar, esto en realidad nunca terminó para mí. Tuve esto funcionando en un servidor todo el fin de semana.

Si se supone que NewID siempre debe dar una identificación aleatoria, ¿por qué ese 4 siempre está ahí?

BC13DF1C-60FB-41C2-B5B2-8F1A73CF2485 
D790D359-AB3D-4657-A864-FA89FACB3E99 
DF1BBC0C-4205-48E8-A1B6-EA9544D7C6E5 

¿Es la posición 15 algún tipo de identificación en cuanto al sistema que generó el identificador único?

De hecho, ocurre lo mismo con la función System.Guid.Newguid de VB.net. ¿Es el 4 una cosa de Microsoft?

Editar: Tal vez debería haber preguntado, ¿son realmente únicos? ¿Se puede confiar en que sean únicos en una base de datos completa? Conozco los sistemas de bases de datos basados ​​en la suposición de que se garantiza que son únicos dentro de la base de datos. Con varios millones de registros en diferentes tablas ... ¿Alguno de ellos es potencialmente el mismo?

Respuesta

7

El 4 indica que se generó usando un número pseudoaleatorio; Ver Wikipedia's article for Globally Unique Identifiers under Algorithm.

+0

Lo veo, en V4 GUIDs. Siempre fue una curiosidad mía, ya que supuse que eran únicos. Y si un byte es siempre el mismo, ¿cómo newid puede producir una identificación única de base de datos? Seguramente debe haber una posibilidad de que genere uno ya usado. – Elarys

+1

Las probabilidades de generar el mismo número dos veces son bastante bajas, y los algoritmos que utilizan (que el 4 especifica un algoritmo en particular) ayudan a reducir aún más las probabilidades de un duplicado. Piense en usted y en un amigo cada vez que lanza una moneda y obtiene los mismos resultados cada vez para 122 volteos seguidos ... –

+0

(obtuve 122 del RFC vinculado en wikipedia; los bits 6, 7 y 12-15 están configurados para valores específicos, y los bits restantes (128-6) se eligen al azar). –

7

Los GUID no son completamente aleatorios; se generan de acuerdo con a specific algorithm, que varía un poco según la versión del GUID.

Específicamente, cuando el primer dígito del tercer grupo es 4, eso significa que es un GUID v4.

8

Está relacionado con la versión UUID/GUID y cómo se arma. Full details on Wikipedia, resumen:

En la representación canónica, xxxxxxxxxxxx-Mxxx-Nxxx-xxxxxxxxxxxx, los bits más significativos de N indica la variante (dependiendo de la variante; uno, dos o tres bits se utilizan). La variante cubierta por la especificación UUID está indicada por los dos bits más significativos de N que son 1 0 (es decir, el N hexadecimal siempre será 8, 9, a, o b).

En la variante cubierta por la especificación UUID, hay cinco versiones. Para esta variante, los cuatro bits de M indican la versión de UUID (es decir, la M hexadecimal será 1, 2, 3, 4 o 5).

...

versión 4 (al azar)

versión 4 UUID utilizar un esquema de confiar sólo en números aleatorios. Este algoritmo establece el número de versión, así como dos bits reservados. Todos los demás bits se establecen utilizando una fuente de datos aleatoria o pseudoaleatoria.

Versión 4 Los UUID tienen la forma xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx donde x es cualquier dígito hexadecimal e y es uno de 8, 9, A o B. ej. f47ac10b-58cc-4372-a567-0e02b2c3d479.

Básicamente, ese dígito es la versión del UUID, que explica cómo se creó.4 indica al azar, por lo que la consecuencia es que MSSQL usa generación aleatoria (en comparación con la dirección MAC basada, por ejemplo).

Creo, aunque no estoy seguro, que la mayoría de las herramientas de MS y posiblemente las funciones de creación de GUAP de WinAPI crean todos UUID de versión 4. Echando un vistazo a una dispersión de COM GUIDs, este parece ser el caso.

Cuestiones relacionadas