В нашем приложении мы создаем файлы Xml с атрибутом, имеющим значение Guid. Это значение должно быть согласованным между обновлениями файлов. Таким образом, даже если все остальное в файле изменится, значение guid для атрибута должно остаться прежним.
Одним из очевидных решений было создание статического словаря с именем файла и Guids, которые будут использоваться для них. Затем всякий раз, когда мы генерируем файл, мы ищем в словаре имя файла и используем соответствующий guid. Но это невозможно, потому что мы могли масштабироваться до 100 файлов и не хотели поддерживать большой список руководств.
Таким образом, другой подход заключался в том, чтобы сделать Guid одинаковым на основе пути к файлу. Поскольку наши пути к файлам и структура каталогов приложения уникальны, Guid должен быть уникальным для этого пути. Таким образом, каждый раз, когда мы запускаем обновление, файл получает один и тот же идентификатор в зависимости от его пути. Я нашел один классный способ создания таких « детерминированных направляющих » (спасибо Элтону Стоунману). В основном это делается так:
private Guid GetDeterministicGuid(string input)
{
//use MD5 hash to get a 16-byte hash of the string:
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
byte[] inputBytes = Encoding.Default.GetBytes(input);
byte[] hashBytes = provider.ComputeHash(inputBytes);
//generate a guid from the hash:
Guid hashGuid = new Guid(hashBytes);
return hashGuid;
}
Таким образом, для строки Guid всегда будет одним и тем же.
Есть ли другие подходы или рекомендуемые способы сделать это? Каковы плюсы и минусы этого метода?
Это преобразует любую строку в Guid без необходимости импорта внешней сборки.
Есть гораздо лучшие способы сгенерировать уникальный Guid, но это способ последовательного обновления строкового ключа данных до ключа данных Guid.
источник
Как упоминает Роб, ваш метод не генерирует UUID, он генерирует хэш, который выглядит как UUID.
RFC 4122 на UUID , в частности , позволяет детерминированных (имя) на основе UUID , - версии 3 и 5 Использование MD5 и SHA1 (соответственно). Большинство людей, вероятно, знакомы с версией 4, которая случайна. Википедия дает хороший обзор версий. (Обратите внимание, что использование слова «версия» здесь, кажется, описывает «тип» UUID - версия 5 не заменяет версию 4).
Кажется, существует несколько библиотек для генерации UUID версии 3/5, включая модуль uuid python , boost.uuid (C ++) и OSSP UUID . (Я не искал никаких .net)
источник
Вам нужно различать экземпляры класса
Guid
и идентификаторы, которые уникальны в глобальном масштабе. «Детерминированный гид» на самом деле является хешем (о чем свидетельствует ваш вызовprovider.ComputeHash
). Хэши имеют гораздо более высокий шанс коллизий (две разные строки создают один и тот же хеш), чем Guid, созданный с помощьюGuid.NewGuid
.Таким образом, проблема с вашим подходом заключается в том, что вы должны быть в порядке с возможностью того, что два разных пути будут создавать один и тот же GUID. Если вам нужен идентификатор, уникальный для любой заданной строки пути, то проще всего использовать эту строку . Если вам нужно, чтобы строка была скрыта от пользователей, зашифруйте ее - вы можете использовать ROT13 или что-то более мощное ...
Попытка вставить что-то, что не является чистым GUID, в тип данных GUID может привести к проблемам с обслуживанием в будущем ...
источник
MD5 слаб, я считаю, что вы можете сделать то же самое с SHA-1 и получить лучшие результаты.
Кстати, просто личное мнение, одевание хэша md5 в качестве GUID не делает его хорошим GUID. GUID по самой своей природе недетерминированы. это похоже на чит. Почему бы просто не назвать вещи своими именами и просто сказать, что это строковый хэш ввода. вы можете сделать это, используя эту строку, а не новую строку guid:
источник
Guid
объект?