Как сгенерировать guid из DateTime? - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу сгенерировать Guid v.1 из DateTime.Я пытаюсь использовать класс, описанный здесь:

https://gist.github.com/nberardi/3759706

Но после получения DateTime от Guid я попытался получить то же самое Guid как оригинал, использующий этот DateTime, и он дал мне другой Guid.Вот код, который я использовал:

  string uuidString = "9e5713bb-bb4c-11e8-9d6c-12345678df23";
  Guid gui = new Guid(uuidString);
  DateTime dateTimeFromGuid = GuidGenerator.GetDateTime(gui);
  Console.WriteLine(dateTimeFromGuid.ToString("dd/MM/yyyy hh:mm:ss"));
  Guid guidFromDateTime = GuidGenerator.GenerateTimeBasedGuid(dateTimeFromGuid);
  Console.WriteLine(guidFromDateTime); //7909dbbb-bb33-11e8-9f6a-95d8e90ccf10

Как я могу получить исходный идентификатор GUID от DateTime?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Если целью является получение воспроизводимых идентификаторов GUID, то вам необходимо отключить случайные компоненты.Они устанавливаются при запуске программы.После этого они больше не изменяются, поэтому сгенерированные GUID с тех пор остаются стабильными, но при каждом запуске программы будут использоваться разные случайные значения, поэтому каждый запуск будет давать разные полуслучайные GUID для известного значения даты и времени.

Чтобы отключить его, просто выполните:

//var random = new Random();
//random.NextBytes(DefaultClockSequence);
//random.NextBytes(DefaultNode);

Кроме того, при его локальном запуске вы должны заставить значение DateTime использовать UTC, что я сделал следующим образом:

DateTime dateTimeFromGuid = GuidGenerator.GetDateTime(gui);
dateTimeFromGuid = new DateTime(dateTimeFromGuid.Ticks, DateTimeKind.Utc);

Было бы намного лучше перенести это «исправление UTC» в код библиотеки.

Fiddle (я также изменил GUID ввода на «нерандомизированное» значение):
https://dotnetfiddle.net/niIHlz

0 голосов
/ 18 сентября 2018

Если вы хотите что-то простое, которое можно конвертировать туда и обратно независимо от того, на какой машине вы находитесь.Затем вы можете преобразовать дату в байтовый массив и использовать ее для создания Guid.Это нестандартно, но будет генерировать одинаковые значения Guid для каждого DateTime.

var today = new DateTime(2018, 9, 18, 10, 59, 00);

var bytes = BitConverter.GetBytes(today.Ticks);

Array.Resize(ref bytes, 16);

var guid = new Guid(bytes);

Console.WriteLine(guid); //bd02b200-1d55-08d6-0000-000000000000

И вернуться к дате.

var dateBytes = guid.ToByteArray();

Array.Resize(ref dateBytes, 8);

var date = new DateTime(BitConverter.ToInt64(dateBytes));

Console.WriteLine(date); //9/18/2018 10:59:00

Если вы хотите использовать расширениятогда.

class Program
{
    static void Main(string[] args)
    {
        var date = new DateTime(2018, 09, 18, 12, 00, 00);

        var guid = date.ToGuid();

        Console.WriteLine(guid); // 428a6000-1d5e-08d6-0000-000000000000

        var back2date = guid.ToDateTime();

        Console.WriteLine(back2date); // 9/18/2018 12:00:00
    }
}

public static class DateTimeExtensions
{
    public static Guid ToGuid(this DateTime dt)
    {
        var bytes = BitConverter.GetBytes(dt.Ticks);

        Array.Resize(ref bytes, 16);

        return new Guid(bytes);
    }
}

public static class GuidExtensions
{
    public static DateTime ToDateTime(this Guid guid)
    {
        var bytes = guid.ToByteArray();

        Array.Resize(ref bytes, 8);

        return new DateTime(BitConverter.ToInt64(bytes));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...