如何在C#中执行SHA1文件校验和?

Fir*_*eel 59 .net c# checksum sha1

如何使用SHA1CryptoServiceProvider()文件创建文件的SHA1校验和?

小智 74

using (FileStream fs = new FileStream(@"C:\file\location", FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        byte[] hash = sha1.ComputeHash(bs);
        StringBuilder formatted = new StringBuilder(2 * hash.Length);
        foreach (byte b in hash)
        {
            formatted.AppendFormat("{0:X2}", b);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

formatted包含SHA-1哈希的字符串表示形式.此外,通过使用FileStream而不是字节缓冲区,ComputeHash以块为单位计算散列,因此您不必一次性加载整个文件,这对大文件很有用.

  • 我认为你不需要使用BufferedStream.http://stackoverflow.com/a/2069317/64334 (9认同)
  • 您应该使用`StringBuilder`而不是在构建哈希字符串的过程中生成20个字符串. (3认同)
  • StringBuilder的初始容量应该是哈希中字节数的两倍 (3认同)

Ben*_*key 61

使用ComputeHash方法.看这里:

ComputeHash

示例代码段:

using(var cryptoProvider = new SHA1CryptoServiceProvider())
{
    string hash = BitConverter
            .ToString(cryptoProvider.ComputeHash(buffer));

    //do something with hash
}
Run Code Online (Sandbox Code Playgroud)

缓冲区是文件的内容.

  • +1用于使用"BitConverter"一次生成十六进制字符串的一个很好的提示. (4认同)
  • 与@mgbowen 的解决方案不同,“BitConverter”使用破折号 AA-F0-CC 分隔字节。可能是也可能不是想要的。 (2认同)

Dan*_*ars 5

如果您已经将文件作为流读取,则以下技术会在您读取时计算哈希值.唯一需要注意的是,你需要消耗整个流.

class Program
    {
        static void Main(string[] args)
        {
            String sourceFileName = "C:\\test.txt";
            Byte[] shaHash;

            //Use Sha1Managed if you really want sha1
            using (var shaForStream = new SHA256Managed())
            using (Stream sourceFileStream = File.Open(sourceFileName, FileMode.Open))
            using (Stream sourceStream = new CryptoStream(sourceFileStream, shaForStream, CryptoStreamMode.Read))
            {
                //Do something with the sourceStream 
                //NOTE You need to read all the bytes, otherwise you'll get an exception ({"Hash must be finalized before the hash value is retrieved."}) 
                while(sourceStream.ReadByte() != -1);                
                shaHash = shaForStream.Hash;
            }

            Console.WriteLine(Convert.ToBase64String(shaHash));
        }
    }
Run Code Online (Sandbox Code Playgroud)