2017-05-07 43 views
-1

截至目前我可以哈希列表框中选择的项目与MD5哈希整个列表框

Public Function Md5FromString(ByVal Source As String) As String 
    Dim Bytes() As Byte 
    Dim sb As New StringBuilder() 
    'Check for empty string. 
    If String.IsNullOrEmpty(Source) Then 
     Throw New ArgumentNullException 
    End If 
    'Get bytes from string. 
    Bytes = Encoding.Default.GetBytes(Source) 
    'Get md5 hash 
    Bytes = MD5.Create().ComputeHash(Bytes) 
    'Loop though the byte array and convert each byte to hex. 
    For x As Integer = 0 To Bytes.Length - 1 
     sb.Append(Bytes(x).ToString("x2")) 
     On Error Resume Next 
    Next 
    'Return md5 hash. 
    Return sb.ToString() 

End Function 

,并收集他们在另一个列表框,但我得到一个错误(类型的未处理的异常“System.StackOverflowException”发生在系统.Windows.Forms.dll)在大约4K随机后,好像它无法更新标签或文本框,然后必须编辑我的列表和重置,我只是觉得有一个更好的方法来做到这一点。 更有经验的人可以提供一些指导,使这个例程更有效率?

+0

嗨,请发布完整的错误,stacktrace和引发错误的行。 – Stefan

+0

说;你为什么要加密列表框内容?加密源代码可能会更好,或者,如果将其保存到磁盘或目标中,则可能是目标。在这种情况下,您可以加密整个文件。 – Stefan

+0

'On Error Resume Next'行是一个坏迹象。 – LarsTech

回答

0

不知道你的错误来自哪里,但你肯定不需要在紧密循环中使用Create()。保存它作为一个局部变量,并通过声明为静态的再使用(或保持在一流水平的参考,而不是):

Public Function Md5FromString(ByVal Source As String) As String 
    Static local_MD5 As MD5 = MD5.Create 

    If String.IsNullOrEmpty(Source) Then 
     Throw New ArgumentNullException 
    End If 

    Dim sb As New StringBuilder() 
    For Each b As Byte In local_MD5.ComputeHash(Encoding.Default.GetBytes(Source)) 
     sb.Append(b.ToString("x2")) 
    Next 
    Return sb.ToString() 
End Function 
0

好了,这里就是我想出的工作不比我在做什么通过一个巨大的约束,我等待了大约一个小时的4K哈希,现在我通过对来自.txt的字符串进行哈希处理,从而获得了50K的分钟数。可能仍然是混乱的,但它的工作方式更快。

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    TextBox1.Text = "" 
    OpenFileDialog1.Title = "Please Select a File" 
    OpenFileDialog1.InitialDirectory = "C:temp" 
    OpenFileDialog1.ShowDialog() 
    Dim path As String = OpenFileDialog1.FileName 
    TextBox1.Text = path 
    Dim lines() As String = IO.File.ReadAllLines(TextBox1.Text) 
    For Each line In lines 
     ListBox1.Items.Add(Md5FromString(line) + ":" + line) 
     ListBox1.Refresh() 
     Label1.Text = ListBox1.Items.Count 
     Label1.Refresh() 
     If ListBox1.Items.Count = 1000 Then 
      save() 
      ListBox1.Items.Clear() 
      ListBox1.Refresh() 
      Label1.Text = 0 
     End If 
    Next 


    ' ListBox1.SelectedIndex = 0 

End Sub 
+0

将1000更改为1,现在它撕开列表并立即保存到新的.txt中 –

+0

如果您一起摆脱了ListBox,它的速度会更快!你无法快速阅读它们,那为什么要更新屏幕?......更新屏幕会降低屏幕的速度。只需将ProgressBar设置为“字幕”样式并处理BackgroundWorker()中的所有行即可。此外,对于较大的文件,您应该[使用File.ReadLines()而不是File.ReadAllLines()](http://stackoverflow.com/a/21970035/2330053)。使用ReadAllLines()会使整个文件一次被读入内存。如果文件足够大,则会导致使用交换文件,进一步放慢速度。 –

+0

...以及这是如何解决你原来的问题的错误?...你从来没有告诉我们是什么原因导致它。 –