使用以下代码计算文件的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不匹配,因此失败了重复检查。
我们如何检查不包含文件属性的文件哈希?或者这里有不同的问题吗?
答案 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 ) {}
每个文件末尾都有一个额外的空字节。