This article explica cómo se generan las guías.¿Podemos decodificar un Guid para averiguar dónde y cuándo se generó?
Mi pregunta es si hay alguna forma de averiguar qué máquina de mi granja web generó este Guid y cuándo?
This article explica cómo se generan las guías.¿Podemos decodificar un Guid para averiguar dónde y cuándo se generó?
Mi pregunta es si hay alguna forma de averiguar qué máquina de mi granja web generó este Guid y cuándo?
Neil Fenwick es correcto. Sin embargo, podemos usar la estructura para nuestra ventaja.
Versión 4 (.Net)
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. Los UUID de versión 4 tienen el formato xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx donde x es cualquier dígito hexadecimal e y es uno de 8, 9, A o B. p. f47ac10b-58cc-4372-a567-0e02b2c3d479.
Utilizar el campo Versión
Tenemos la libertad de cambiar el primer cuarteto del byte 8; entonces, si tiene menos de 17 máquinas, puede identificarlas alterando los GUID creados en cada una.
static Guid NewSystemGuid(int machine)
{
if (machine < 0 | machine > 0xF)
throw new ArgumentOutOfRangeException("machine");
var g = Guid.NewGuid();
var arr = g.ToByteArray();
arr[7] = (byte)((machine << 4) | (arr[7] & 0xF));
return new Guid(arr);
}
static int ExtractMachine(Guid guid)
{
var arr = guid.ToByteArray();
return (arr[7] >> 4) & 0xF;
}
utilizar el campo Versión e 'y'
No estoy seguro de si se cambia Y alterará la singularidad del GUID, por lo que su experiencia puede variar. Si tiene menos de 17 máquinas, conserve la primera solución.
static Guid NewSystemGuid(int machine)
{
if (machine < 0 | machine > 0xFF)
throw new ArgumentOutOfRangeException("machine");
var m1 = machine & 0xF;
var m2 = (machine >> 4) & 0xF;
var g = Guid.NewGuid();
var arr = g.ToByteArray();
arr[7] = (byte)((m1 << 4) | (arr[7] & 0xF));
arr[8] = (byte)((m2 << 4) | (arr[8] & 0xF));
return new Guid(arr);
}
static int ExtractMachine(Guid guid)
{
var arr = guid.ToByteArray();
return
((arr[7] >> 4) & 0xF) |
(((arr[8] >> 4) & 0xF) << 4);
}
utilizar la versión y 'y' (Redux)
Puede aún conservan el valor de 'Y', al limitar la cantidad de máquinas a 63 (utilizando los últimos 2 bits para representar la 4 valores posibles de la 'Y'):
static Guid NewSystemGuid(int machine)
{
if (machine < 0 | machine > 0x3F)
throw new ArgumentOutOfRangeException("machine");
var m1 = machine & 0xF;
var m2 = (machine >> 4) & 0xF;
var g = Guid.NewGuid();
var arr = g.ToByteArray();
arr[7] = (byte)((m1 << 4) | (arr[7] & 0xF));
var y = (arr[8] >> 4) & 0xF;
switch (y)
{
case 0x8:
arr[8] = (byte)((m2 << 4) | (arr[8] & 0xF));
break;
case 0x9:
arr[8] = (byte)(((m2 | 0x8) << 4) | (arr[8] & 0xF));
break;
case 0xA:
arr[8] = (byte)(((m2 | 0x4) << 4) | (arr[8] & 0xF));
break;
case 0xB:
arr[8] = (byte)(((m2 | 0xC) << 4) | (arr[8] & 0xF));
break;
default:
throw new Exception();
}
return new Guid(arr);
}
static int ExtractMachine(Guid guid)
{
var arr = guid.ToByteArray();
return
((arr[7] >> 4) & 0xF) |
(((arr[8] >> 4) & 0x3) << 4);
}
utilizar la versión 1 GUID
Usted podría col a fin de utilizar la versión 1 GUID, ya que todavía es posible generarlos:
class SequentialGuid
{
[DllImport("rpcrt4.dll", SetLastError = true)]
static extern int UuidCreateSequential(out Guid guid);
public static Guid NewGuid()
{
Guid guid;
UuidCreateSequential(out guid);
return guid;
}
public static byte[] ExtractMacAddress(Guid guid)
{
var arr = guid.ToByteArray();
// Require version 1.
if (((arr[7] >> 4) & 0xF) != 1)
throw new ArgumentOutOfRangeException("guid", "GUID is required to be a sequential (version 1) GUID.");
var macLong = BitConverter.ToInt64(arr, arr.Length - 8);
macLong = IPAddress.NetworkToHostOrder(macLong);
arr = BitConverter.GetBytes(macLong);
Array.Resize(ref arr, 6);
return arr;
}
}
Sí - toda la información que necesita para hacer esto es en ese artículo y el proyecto de Internet vinculado. Esto supone que su GUID se generó con ese algoritmo, si se generó con un algoritmo diferente, necesita encontrar la especificación/detalles de ese algoritmo. Puede usar el campo Variante (descrito en la nota vinculada) para determinar qué variante de diseño se utilizó. – Justin