const int YEAR_ORIGIN = 2000;
const int ID_MAX = 2097151;
public static void Main()
var now = DateTime.UtcNow;
long id = (long)(now.Year - YEAR_ORIGIN) << 57;
id |= (long)now.Month << 53;
id |= (long)now.Day << 48;
id |= (long)now.Hour << 43;
id |= (long)now.Minute << 37;
id |= (long)now.Second << 31;
id |= (long)now.Millisecond << 21;
id |= rng.Next(0, ID_MAX);
Console.WriteLine("random lower: " + id.ToString("X2") + ": " + id);
id = (long)(now.Year - YEAR_ORIGIN) << 36;
id |= (long)now.Month << 32;
id |= (long)now.Day << 27;
id |= (long)now.Hour << 22;
id |= (long)now.Minute << 16;
id |= (long)now.Second << 10;
id |= (long)now.Millisecond;
id |= ((long)rng.Next(0, ID_MAX)) << 43;
Console.WriteLine("random upper: " + id.ToString("X2") + ": " + id);
Console.WriteLine("set sign bit: " + id.ToString("X2") + ": " + id);
Console.WriteLine(" no sign bit: " + id.ToString("X2") + ": " + id);