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

좋아, 여기에 내가 무엇을하고 있었는지 나는보다 더 나은 일을 파악하는 방법이다 엄청난 묶음으로 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를 "Marquee"스타일로 설정하고 BackgroundWorker()의 모든 선을 처리하면됩니다. 또한 큰 파일의 경우 [File.ReadAllLines()] 대신 File.ReadLines()를 사용해야합니다 (http://stackoverflow.com/a/21970035/2330053). ReadAllLines()를 사용하면 전체 파일이 메모리에 즉시 읽혀집니다. 파일이 충분히 크면 스왑 파일을 사용하여 속도를 늦추 게됩니다. –

+0

...이 질문은 귀하의 원래 질문에서 귀하의 오류를 어떻게 수정합니까? –