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?
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
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 ... –
(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). –