В C # возможно ли получить хэш из массива байтов, который безопасен для имени файла?

#c# #hash #sha1

#c# #хэш #sha1

Вопрос:

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

Возможно ли это? Я сделал это, используя SHA1, но получил символы в результирующем хэше, которые не были безопасны для файловой системы (косые черты, двоеточия и т.д.).

Комментарии:

1. хэш — это просто число; вы можете преобразовать в любое представление, которое вам нравится (например, в MIME64 или в кодировку, в которой нет недопустимых символов пути)

2. Кроме того, идея о том, что использование хэша даст вам уникальное значение, ошибочна. Хэши as спроектированы так, чтобы иметь низкую вероятность столкновений при разумном размере задачи, но эта вероятность не равна нулю. Если вы выполняете более нескольких из этих действий, вам нужно быть готовым к тому, что произойдет, когда два ввода приведут к одному и тому же хэшу.

3. @Joel: SHA1 равен 160 битам, не так ли? Я почти уверен, что это означает, что вероятность столкновения бесконечно мала для любого разумного количества входных данных.

Ответ №1:

 var originalBytes = Encoding.ASCII.GetBytes(data);
var hashedBytes = Hasher.ComputeHash(originalBytes);

var builder = new StringBuilder();
foreach (Byte hashed in hashedBytes)
    builder.AppendFormat("{0:x2}", hashed);

return builder.ToString();
  

по сути, это эквивалентно тому, что делает git

Комментарии:

1. Это был экземпляр, который был введен, но его можно легко заменить любым алгоритмом хэширования (sha1, md5 и т.д.)

2. Итак, это код для того, чтобы взять хэш, созданный другими способами, и корректно сделать его безопасным для файловой системы? Может ли его «очистка» привести к потенциальным коллизиям? Может ли «очистка» двух разных хэшей привести к тому, что они приведут к одному и тому же конечному значению?

3. нет, это невозможно. он принимает каждый байт и преобразует его в представление base16 (0-F), поэтому данные не теряются.