我如何使用SHA1CryptoServiceProvider()
对文件进行操作以创建该文件的SHA1校验和?
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);
}
}
}
formatted
包含 SHA-1 哈希的字符串表示。此外,通过使用 FileStream
而不是字节缓冲区,ComputeHash
会分块计算哈希值,因此您无需一次性加载整个文件,这对于大文件非常有用。
使用ComputeHash方法,参见此处:
示例代码片段:
using(var cryptoProvider = new SHA1CryptoServiceProvider())
{
string hash = BitConverter
.ToString(cryptoProvider.ComputeHash(buffer));
//do something with hash
}
buffer是您文件的内容。
BitConverter
中使用技巧生成十六进制字符串的建议,给予一个大加赞同(+1)。 - Igor Brejcusing
块中。 - Mike737BitConverter
使用连字符 AA-F0-CC 分隔字节,不同于 @mgbowen 的解决方案。可能是所需的,也可能不是。 - Eric J.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));
}
}
CryptoStream
。如果您想从某个地方(例如:从 HTTP 请求)读取文件,将其写入某个位置(例如:磁盘),同时计算哈希值,那么它可能非常有用。 - tigrou你也可以尝试以下方法:
FileStream fop = File.OpenRead(@"C:\test.bin");
string chksum = BitConverter.ToString(System.Security.Cryptography.SHA1.Create().ComputeHash(fop));
StringBuilder
而不是生成20个字符串。 - Igor Brejc