【问题标题】:VB.NET MD5 Comparing using large filesVB.NET MD5 使用大文件进行比较
【发布时间】:2015-01-22 18:23:12
【问题描述】:

我正在尝试在 VB.NET 2010 中创建一个具有简单功能的程序。 它必须将存储在文本文件中的数千个 MD5 哈希值与程序在打开文件时自动计算的当前文件 MD5 哈希值进行比较。 就像防病毒扫描程序一样。 实际上我的程序使用ReadAllText系统将文本文件中的所有哈希添加到文本框,然后比较它们。

当 Md5 数据库(带有散列的文本文件)很小时,一切都还好,但是当文件变大时,我的程序在打开后就会冻结,所以我决定使用 ReadLine 而不是 ReadAllText

现在我不能再使用文本框了,所以给我一个比较它们的方法。 我尝试了一种方法,但它似乎不起作用。

这是我使用 ReadLine 的代码。

问题出在If Read contains(buff.tostring) 以前是 如果 textbox.text 包含 (buff.toString)

这里是代码

Try
            TextBox2.Text = e.FullPath
            ListBox3.Items.Add(TextBox2.Text.ToString)
            Me.OpenFileDialog1.FileName = ""
            Dim reader As StreamReader = New StreamReader("def.txt")
            Dim read = reader.ReadLine()
            Dim md5 As New MD5CryptoServiceProvider
            Dim f As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000)
            f = New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000)
            md5.ComputeHash(f)
            Dim hash As Byte() = md5.Hash
            Dim buff As New StringBuilder
            Dim hashByte As Byte
            For Each hashByte In hash
                buff.Append(String.Format("{0:X2}", hashByte))
            Next
            f.Close()
            If read.Contains(buff.ToString) Then
                Me.OpenFileDialog1.FileName = e.FullPath
                Form2.ShowDialog()

            End If

        Catch exception1 As Exception
            ProjectData.SetProjectError(exception1)
            Dim ex As Exception = exception1
            ProjectData.ClearProjectError()
        End Try

【问题讨论】:

  • 使用 List(of String) 存储哈希列表的列表。或使用 File.ReadLines 将它们作为数组获取并从那里使用它
  • 怎么样?更加明确。该文件非常大(20 MB)
  • 如果您可以修改我的代码并将其作为答案发布就可以了。如果您这样做,我想将其标记为我的问题的答案。谢谢!
  • 你真的需要文本框吗?您是否要求在屏幕上显示该信息?
  • 然后使用普通的字符串变量(Dim data As String)。像文本框这样的 UI 控件应该用于在屏幕上显示信息,而不是作为数据的存储。您的代码示例不使用文本框。

标签: vb.net hash md5 scanning


【解决方案1】:

我会首先创建函数来拆分功能。之后理解代码要容易得多。 将哈希值存储在列表中,然后需要缓存此列表。

Try

    TextBox2.Text = e.FullPath
    ListBox3.Items.Add(TextBox2.Text.ToString)
    Me.OpenFileDialog1.FileName = ""

    Dim allHash As List(Of String) = GetAllHash()
    Dim curHash As String = GetFileHash(e.FullPath)

    If allHash.Contains(curHash) Then
        Me.OpenFileDialog1.FileName = e.FullPath
        Form2.ShowDialog()
    End If

Catch exception1 As Exception
    ProjectData.SetProjectError(exception1)
    Dim ex As Exception = exception1
    ProjectData.ClearProjectError()
End Try

Function GetAllHash() As List(Of String)

    ' Store the data in a list instead
    Return System.IO.File.ReadAllLines("def.txt").ToList()
End Function

Function GetFileHash(ByVal filename As String) As String

    Dim md5 As New MD5CryptoServiceProvider
    ' Only open the file once
    Dim f As New FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, &H2000)
    md5.ComputeHash(f)
    Dim hash As Byte() = md5.Hash
    Dim buff As New StringBuilder

    For Each hashByte As Byte In hash
        buff.Append(String.Format("{0:X2}", hashByte))
    Next

    f.Close()

    Return buff.ToString()
End Function
  • 我没有编译这段代码,这只是一个示例,向您展示可以做什么。

【讨论】:

  • @F.C.E.365 我从你的例子中得到了 e.FullPath。它不应该冻结一个 20mb 的文件。如果文件从不更改,则 ReadAllLines 只能执行一次,前提是列表存储在某个地方以供其他时间使用。
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 2018-11-16
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
相关资源
最近更新 更多