没有文件属性的文件的md5哈希

时间:2010-04-28 15:50:03

标签: .net sql-server-2005 hash md5

使用以下代码计算文件的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 DB中。当我们上传相同的文件实例时,这很好用。但是当我们从文件系统中保存文件的新实例(今天的日期为创建/修改),然后检查新的哈希与存储在数据库中的MD5不匹配,因此失败了重复检查。

我们如何检查不包含文件属性的文件哈希?或者这里有不同的问题吗?

2 个答案:

答案 0 :(得分:1)

我怀疑Me._BinaryData的初始化不仅仅是文件的内容......

最终,散列可以改变的唯一方法是字节数组是否发生变化。

当您从数据库中保留/恢复文件时,另一种可能是字符集/编码差异。

答案 1 :(得分:0)

答案是数组声明的'OL'问题。大小是UpperBound而不是长度。

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

应该是:

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

每个文件末尾都有一个额外的空字节。