Допустимо ли создание Guid из хэша MD5 вместо String? - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь реализовать метод обнаружения дубликатов файлов. У меня есть метод хеширования MD5 (давайте проигнорируем тот факт, что MD5 не работает), как показано ниже:

using(MD5 hasher = MD5.Create())
using(FileStream fs = File.OpenRead("SomeFile"))
{
    byte[] hashBytes = hasher.ComputeHash(fs);
    string hashString = string.Join(string.Empty, hashBytes.Select(x => x.ToString("X2"))); 
}

Вместо создания string из hashBytes могу ли я просто создать Guid из него, например, так?

Guid hashGuid = new Guid(hashBytes);

Будет ли оно все еще действительным или я потеряю уникальность?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

MD5-хэши и Guid по существу оба выражают 128 бит двоичного кода, поэтому:

  • плюс: вы не потеряете уникальность
  • plus: тот факт, что Guid является типом значения, означает, что вы избегаете выделения по сравнению с string ...
  • минус: ... но если вы собираетесь отобразить это где угодно, вы можете на самом деле выделить несколько строк (т.е. отрендерить один и тот же Guid несколько раз)
  • минус: в Guid есть семантическое значение, которое на самом деле здесь не будет уважаться / ожидаться
  • минус: Guid форматирование по умолчанию отличается от того, как обычно выражаются хеши MD5
  • минус: Guid порядковый номер - это беспорядок , поэтому, если вы хотите получить между необработанными байтами и любым текстовым представлением: шаг очень осторожно; это не то, что вы ожидаете
0 голосов
/ 05 апреля 2019

Направляющие могут гарантировать уникальность только в том случае, если они сгенерированы должным образом путем вызова Guid.NewGuid().Создавая Guids из байтов MD5, вы получаете нулевую уникальность.Вы сохраняете свои байты только в структуре данных с именем «Глобальный уникальный идентификатор», которая потенциально может быть не уникальной.

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

0 голосов
/ 05 апреля 2019

Не уверен, что это лучшая идея, но, поскольку оба значения 128-битные, вы не потеряете никакие данные, при условии, что вы не пытаетесь преобразовать текстовое представление MD5 .

Просто преобразуйте байты MD5 непосредственно в GUID, не преобразовывая его сначала в string.

...