хэш md5 для файла без атрибутов файла - PullRequest
1 голос
/ 28 апреля 2010

Использование следующего кода для вычисления хэшей файлов MD5:

 Private _MD5Hash As String
 Dim _BinaryData As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length) {}
 FileUpload1.PostedFile.InputStream.Read(_BinaryData, 0, _BinaryData.Length)

 Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
 Dim md5hash() As Byte
 md5hash = md5.ComputeHash(Me._BinaryData)
 Me._MD5Hash = ByteArrayToString(md5hash)

  Private Function ByteArrayToString(ByVal arrInput() As Byte) As String
     Dim sb As New System.Text.StringBuilder(arrInput.Length * 2)
     For i As Integer = 0 To arrInput.Length - 1
       sb.Append(arrInput(i).ToString("X2"))
     Next
     Return sb.ToString().ToLower
  End Function

Мы получаем разные хэши в зависимости от даты создания и даты изменения файла. Мы храним хеш и двоичный файл в базе данных SQL. Это прекрасно работает, когда мы загружаем один и тот же экземпляр файла. Но когда мы сохраняем новый экземпляр файла из БД (с сегодняшней датой как создание / изменение) в файловой системе, а затем проверяем новый хеш по сравнению с MD5, сохраненным в БД, они не совпадают, и поэтому дубликат чека.

Как мы можем проверить хеш файла, исключая атрибуты файла? или здесь другая проблема?

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Я подозреваю, что Me._BinaryData инициализируется не только содержимым файла ...

В конечном итоге единственный способ изменить хеш - это изменение байтового массива.

Другая возможность - это различия в наборе символов / кодировке при сохранении / восстановлении файла из БД.

0 голосов
/ 28 апреля 2010

Ответом является старый вопрос объявления массива. Размер - верхний предел, а не длина.

Dim _BinaryData As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length) {}

должно быть:

Dim _BinaryData As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length - 1 ) {}

Каждый файл имеет дополнительный пустой байт в конце.

...