2017-05-07 10 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

[OK]を、ここで私は私が何をやっていたよりも良い仕事に考え出した方法です私は4Kハッシュのために約1時間待っていましたが、文字列を.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.ReadAllLines()](http://stackoverflow.com/a/21970035/2330053)の代わりに[File.ReadLines()を使用する必要があります。 ReadAllLines()を使用すると、ファイル全体が一度にメモリに読み込まれます。ファイルが十分に大きければ、スワップファイルを使用して処理速度をさらに遅くすることになります。 –

+0

...これは元の質問からあなたのエラーをどのように修正するのですか? –

関連する問題