我应该如何在C#中计算文件哈希值(md5和SHA1)

n1k*_*ita 12 .net c# hash checksum

这是我的第一个C#项目,我几乎是新手.我使用openfiledialoge选择文件并通过GetFullPath方法获取文件路径并将其存储在一个名为fpath的变量中.我需要计算其路径存储在fpath变量中的文件的哈希值.我认为可以通过GetHashCode来完成.任何人都可以给我一个片段或一个小指南吗?

Sad*_*ida 30

using (FileStream stream = File.OpenRead(file))
{
    SHA256Managed sha = new SHA256Managed();
    byte[] hash = sha.ComputeHash(stream);
    return BitConverter.ToString(hash).Replace("-", String.Empty);
}
Run Code Online (Sandbox Code Playgroud)

  • 您需要添加system.io名称空间 (6认同)
  • 根据我的经验,`SHA256CryptoServiceProvider`比`SHA256Managed`快得多.这通常是一个替代品. (3认同)

Bri*_*ian 13

这是我用来回答SO 上的另一个问题的一些代码

/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(string filePath)
{
    using (var sha1 = new SHA1CryptoServiceProvider())
        return GetHash(filePath, sha1);
}

/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(Stream s)
{
    using (var sha1 = new SHA1CryptoServiceProvider())
        return GetHash(s, sha1);
}

/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(string filePath)
{
    using (var md5 = new MD5CryptoServiceProvider())
        return GetHash(filePath, md5);
}

/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(Stream s)
{
    using (var md5 = new MD5CryptoServiceProvider())
        return GetHash(s, md5);
}

private static string GetHash(string filePath, HashAlgorithm hasher)
{
    using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        return GetHash(fs, hasher);
}

private static string GetHash(Stream s, HashAlgorithm hasher)
{
    var hash = hasher.ComputeHash(s);
    var hashStr = Convert.ToBase64String(hash);
    return hashStr.TrimEnd('=');
}
Run Code Online (Sandbox Code Playgroud)


Kei*_*thS 10

默认情况下,GetHashCode()仅供内部使用,用于检查对对象的两个引用是否实际上是同一个对象.deafult哈希实现基于堆栈/堆位置,因此在程序运行之间不会是确定性的(或者甚至将两个不同的引用与完全相同的数据进行比较).因此,它不应该用于计算校验和.

.NET有一系列用于此目的的内置库; 它们位于System.Security.Cryptography命名空间中.你想要的两个是MD5和SHA1类:

byte[] hashBytes;
using(var inputFileStream = File.Open(filePath))
{
    var md5 = MD5.Create();
    hashBytes = md5.ComputeHash(inputFileStream);
}
Run Code Online (Sandbox Code Playgroud)

SHA1课程的工作方式相同.

谨慎一点; MD5和SHA1都被视为"已损坏",不应在任何需要"安全"哈希的系统中使用.请考虑在整个系统中使用SHA-256或SHA-512算法.如果您不需要安全哈希,那么有更快的校验和哈希值,如FNV-1a或MurmurHash,它们将提供良好的抗冲突性.