Конвертировать идентификатор строки в уникальный Guid (или из md5 в Guid)? - PullRequest
0 голосов
/ 15 октября 2019

Я хотел бы создать систему для преобразования существующего идентификатора (целочисленный идентификатор или идентификатор пользовательской строки)

Я хотел бы создать вспомогательный метод или метод расширения, который генерирует Guid из любого типа int, long или stringстоимость. Идея состоит в том, чтобы обновить базу данных, но сохранить некоторые данные из моей старой базы данных. Каждый раз, когда я конвертирую идентификатор строки типа «O-2019-10-15», система генерирует один и тот же уникальный идентификатор Guid. Давайте сосредоточимся на строке здесь.

    public static Guid GenerateGuid(string input)
    {
        // Convertion
        byte[] _byteIds = Encoding.UTF8.GetBytes(input);

        //What about using MD5?
        MD5CryptoServiceProvider _md5 = new MD5CryptoServiceProvider();
        byte[] _checksum = _md5.ComputeHash(_byteIds);

        // Convert ?
        string part1 = /* ??? */;
        string part2 = /* ??? */;
        string part3 = /* ??? */;
        string part4 = /* ??? */;
        string part5 = /* ??? */;

        //Concat these 4 part into one string
        return Guid.Parse("{0}-{1}-{2}-{3}-{4}", part1, part2, part3, part4, part5);
    }

Что вы думаете? Md5 - правильный старт? Есть ли какое-либо правило в представлении Guid ()?

Идея md5 заключается в том, что я могу преобразовать все в 16-байтовую подпись. Оттуда мне просто нужно преобразовать его в Guid (). Но я не знаю подробностей о Guid. Существуют ли какие-либо правила, уже зарезервированные позиции для каких-либо данных или другой информации?

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Я бы так не поступил.

Я бы использовал Guid.NewGuid() для нового идентификатора, а затем оставил бы старый идентификатор рядом с ним (или в таблице перевода).

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


Если важно сохранить один идентификатор, который я не рекомендую, я бы его в качестве $"{guid}+{oldid}".

1 голос
/ 15 октября 2019

На данный момент я сделал это

Guid GenerateGuid(string input)
{
    byte[] _byteIds = Encoding.UTF8.GetBytes(input);

    MD5CryptoServiceProvider _md5 = new MD5CryptoServiceProvider();
    byte[] _checksum = _md5.ComputeHash(_byteIds);

    //Convert checksum into 4 ulong parts and use BASE36 to encode both
    string part1 = BitConverter.ToString(_checksum, 0, 4).Replace("-", string.Empty);
    string part2 = BitConverter.ToString(_checksum, 4, 2).Replace("-", string.Empty);
    string part3 = BitConverter.ToString(_checksum, 6, 2).Replace("-", string.Empty);
    string part4 = BitConverter.ToString(_checksum, 8, 2).Replace("-", string.Empty);
    string part5 = BitConverter.ToString(_checksum, 10, 6).Replace("-", string.Empty);

    return Guid.Parse($"{part1}-{part2}-{part3}-{part4}-{part5}");
}

Чтобы избежать столкновения, вход также должен быть уникальным в моей среде. Я поставлю перед ним префикс пространства имен.

...