【问题标题】:sha256 : How to use the algorithm as inputsha256 : 如何使用算法作为输入
【发布时间】:2021-04-09 21:26:48
【问题描述】:

好的,这是我的问题。我知道如何使用 C# 进行 HASH,我将此函数用于 Hash Files 并提供进度条:

   public String SHA384CheckSum(String pstrFilePath)
    {
        const Int32 BUFFER_MAX_SIZE = (4 * 1024 * 1000);  //4Mo
        String strRetValue = "";
        String strBaseCaption = this.Text;
        Int64 dblProgression1;
        Int64 dblProgression2 = 0;

        this.Text = strBaseCaption + " [0%]";

        //Should check if file exist first
        if (AppEx.FileExist64(pstrFilePath) == true)
        {
            //using (SHA384 objSHA = SHA384.Create())
            using (SHA384 objSHA = SHA384.Create()) {
                using (FileStream objFileStream = new FileStream(pstrFilePath, FileMode.Open, FileAccess.Read))
                {
                    Int32 _bufferSize;
                    Byte[] readAheadBuffer;
                    Int32 readAheadBytesRead;
                    Int64 lngBytesRemaining = objFileStream.Length;
                    Double dblTotalBytes = lngBytesRemaining;

                    while ((lngBytesRemaining > 0) && (this.glngState != 2))
                    {
                        if (lngBytesRemaining > BUFFER_MAX_SIZE)
                        {
                            _bufferSize = BUFFER_MAX_SIZE;
                        } else {
                            _bufferSize = (Int32)lngBytesRemaining;
                        }

                        readAheadBuffer = new Byte[_bufferSize];
                        readAheadBytesRead = objFileStream.Read(readAheadBuffer, 0, _bufferSize);

                        lngBytesRemaining = (lngBytesRemaining - _bufferSize);
                        if (lngBytesRemaining != 0)
                        {
                            objSHA.TransformBlock(readAheadBuffer, 0, readAheadBytesRead, readAheadBuffer, 0);
                        } else {
                            objSHA.TransformFinalBlock(readAheadBuffer, 0, readAheadBytesRead);
                            strRetValue = BitConverter.ToString(objSHA.Hash).Replace("-", "").ToLower();
                        }

                        dblProgression1 = (Int64)(((dblTotalBytes - lngBytesRemaining) / dblTotalBytes) * 100);
                        if (dblProgression1 != dblProgression2)
                        {
                            dblProgression2 = dblProgression1;
                            this.Text = strBaseCaption + " [" + dblProgression2.ToString() + "%]";
                            Application.DoEvents();
                        }
                    }
                }
            }
        }
        this.Text = strBaseCaption + " [100%]";

        return strRetValue;
    }

这项工作完美无缺。现在假设我想改用 Sha256 进行散列。我所要做的就是改变这一行:

    using (SHA384 objSHA = SHA384.Create())
    to
    using (SHA256 objSHA = SHA256.Create())
    
    How can I pass this as a parameter to the function so I could:
    SHA256 objSHA;
    or
    SHA384 objSHA

and then CALL The Function (..., objSHA)

看起来很简单,因为它们都是来自同一类型的抽象类。 但我缺乏在 C# 中执行此操作的知识。

感谢帮助

【问题讨论】:

  • 我个人认为你应该分离你的关注点,你有 UI 逻辑混合业务逻辑混合哈希逻辑
  • “我缺乏在 C# 中做这件事的知识” -- 缺乏做什么的知识?实际上有许多不同的方法可以解决这个问题,涉及到语言的不同部分,例如类型系统、方法参数、条件语句、lambda 表达式等。具体你在尝试什么做什么,具体你需要什么帮助?请阅读How to Ask,了解如何以清晰、可回答的方式提出您的问题。
  • 彼得:问题是如何传递参数,它是明文形式
  • 如果您希望他们收到回复通知,您需要将@ 放在一个人的用户 ID 之前。

标签: c# hash


【解决方案1】:

让你的方法接收基类作为参数:

public String SHA384CheckSum(String pstrFilePath, HashAlgorithm objSHA)

现在您的调用代码可以像这样调用它:

bool useSha256 = false; // Initialize this any way you want
using (HashAlgorithm algorithm = useSha256 ? (HashAlgorithm)SHA256.Create() : SHA384.Create())
{
    string checksum = SHA384CheckSum(pstrFilePath, algorithm);
}

显然,SHA384CheckSum 不再是这个函数的好名字,所以下一步就是重命名它。

【讨论】:

  • 使用行不起作用我得到:错误 CS0173 条件表达式类型无法确定,因为 'System.Security.Cryptography.SHA256' 和 'System.Security.Cryptography 之间没有隐式转换.SHA384'
  • 谢谢安德鲁,你让我找到了解决方案。我传递了 HashAlgorithmType,然后我为所有 HashAlgorithmType 制作了一个 Switch 案例(使用 SHA384 的默认值),然后在每个案例中我制作了 Create 函数。当然我不得不删除使用,但我最后做了一个处置。所以现在一切正常,我可以传递任何散列类型。
  • @PatriceCharbonneau - 我忘记的问题是,如果您有条件表达式,则必须显式转换表达式中的第一项。 (参见上面我更改的代码,我将SHA256.Create() 的返回值转换为它的基类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2011-08-21
  • 2021-09-03
  • 2020-12-05
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多