文件哈希算法代码c#

时间:2018-02-04 18:16:51

标签: c# algorithm hash cryptography

我的应用程序的一部分希望能够散列用户指定的文件,但我仍然坚持实际的代码本身。请注意:

filepath512(.text) =用户插入文件路径的文本框

fileout(.text) =输出文本框

button21_click =“哈希/确认”按钮用于启动哈希算法

当我运行应用程序并运行散列算法时,没有任何反应(结果不会出现在“输出”文本框中)。 几个星期前,我实际上用相同的代码(好的,相同的结构)成功地执行了散列算法,并且它运行得非常好! 我刚刚开始使用C#,所以请原谅任何凌乱的代码!

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string filePath = e.Argument.ToString();

        byte[] buffer;
        int bytesRead;
        long size;
        long totalBytesRead = 0;

        using (Stream file = File.OpenRead(filePath))
        {
            size = file.Length;

            using (HashAlgorithm hasher = SHA512.Create())
            {
                do
                {
                    buffer = new byte[4096];

                    bytesRead = file.Read(buffer, 0, buffer.Length);

                    totalBytesRead += bytesRead;

                    hasher.TransformBlock(buffer, 0, bytesRead, null, 0);

                    backgroundWorker1.ReportProgress((int)((double)totalBytesRead / size * 100));
                }
                while (bytesRead != 0);

                hasher.TransformFinalBlock(buffer, 0, 0);

                e.Result = MakeHashString(hasher.Hash);
            }
        }

    }

    private static string MakeHashString(byte[] hashbytes)
    {
        StringBuilder hash = new StringBuilder(32);

        foreach (byte b in hashbytes)
            hash.Append(b.ToString("X2").ToLower());

        return hash.ToString();
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar3.Value = e.ProgressPercentage;
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        fileout512.Text = e.Result.ToString();
        progressBar3.Value = 0;
    }

    private void button21_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync(filepath512.Text);
    }

2 个答案:

答案 0 :(得分:1)

实际上,您的代码错过了很多健全性检查。首先,您应该使用OpenFileDialog而不是直接用户输入来指定路径。其次,一旦流程开始,你应该使用File.Exists方法确保文件存在...如果它没有,你应该返回一个合适的结果。

您的代码可能会在某处抛出异常。来自官方MSDN documentation

  

如果操作成功完成并且其结果已分配   DoWork事件处理程序,您可以通过访问结果   RunWorkerCompletedEventArgs.Result属性。

     

[...]

     

您的RunWorkerCompleted事件处理程序应始终检查错误   访问Result属性前已取消和已取消的属性。如果   异常被提出或如果操作被取消,访问   Result属性引发异常。

因此,请使用事件参数的Error属性检查错误详细信息,以确保您的代码在没有异常的情况下正确执行。如果是这种情况,您必须修复代码,以便散列不再失败。

答案 1 :(得分:0)

文件存在吗?您必须在尝试执行操作之前检查文件是否存在。调试文件路径并查看它是否存在,并且它具有读权限。