【问题标题】:How do I create an MD5 hash digest from a text file?如何从文本文件创建 MD5 哈希摘要?
【发布时间】:2011-01-10 03:55:28
【问题描述】:

使用 C#,我想创建一个文本文件的 MD5 哈希。我怎样才能做到这一点?

更新:感谢大家的帮助。我终于确定了以下代码 -

// Create an MD5 hash digest of a file
public string MD5HashFile(string fn)
{            
    byte[] hash = MD5.Create().ComputeHash(File.ReadAllBytes(fn));
    return BitConverter.ToString(hash).Replace("-", "");            
}

【问题讨论】:

标签: c# hash md5


【解决方案1】:

这是我目前正在使用的例程。

    using System.Security.Cryptography;

    public string HashFile(string filePath)
    {
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            return HashFile(fs);
        }
    }

    public string HashFile( FileStream stream )
    {
        StringBuilder sb = new StringBuilder();

        if( stream != null )
        {
            stream.Seek( 0, SeekOrigin.Begin );

            MD5 md5 = MD5CryptoServiceProvider.Create();
            byte[] hash = md5.ComputeHash( stream );
            foreach( byte b in hash )
                sb.Append( b.ToString( "x2" ) );

            stream.Seek( 0, SeekOrigin.Begin );
        }

        return sb.ToString();
    }

【讨论】:

  • 完美的 roufamatic。它是否返回 32 位十六进制?
  • 刚刚测试了这个功能,它完全符合我的要求 - 再次感谢。
  • 如果您不需要重用流,您当然可以删除所有代码。这曾经在某种管道中,因此可以先对流进行哈希处理,然后再进行 gzip 压缩。现在我主要只关心哈希,因此是快捷方式。
【解决方案2】:

简明扼要。 filename 是您的文本文件的名称:

using (var md5 = MD5.Create())
{
    return BitConverter.ToString(md5.ComputeHash(File.ReadAllBytes(filename))).Replace("-", "");
}

【讨论】:

  • ToBase64String 没有返回我想要的。但是,字节数组周围的 BitConverter.ToString 可以解决问题
【解决方案3】:

这可以通过GetHashCode 的重载来实现,允许传递文件路径、StreamReader 或 Stream:

private static string GetHashCode(string filePath, HashAlgorithm cryptoService = null)
    => GetHashCode(fStream: new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), cryptoService);

private static string GetHashCode(StreamReader fileStreamReader, HashAlgorithm cryptoService = null)
    => GetHashCode(fileStreamReader.BaseStream, cryptoService);


/// <summary>
/// Compute hash code for file.
/// </summary>
/// <param name="fStream"></param>
/// <param name="cryptoService">This can be either MD5, SHA1, SHA256, SHA384 or SHA512</param>
/// <returns>Hash string</returns>
private static string GetHashCode(Stream fStream, HashAlgorithm cryptoService = null)
{

    // create or use the instance of the crypto service provider
    // this can be either MD5, SHA1, SHA256, SHA384 or SHA512
    using (cryptoService ??= System.Security.Cryptography.SHA512.Create())
    {
        using var tmpStream = fStream;
        var hash = cryptoService.ComputeHash(tmpStream);
        var hashString = Convert.ToBase64String(hash);
        return hashString.TrimEnd('=');
    }
} // method

用法:

WriteLine("Default Sha512 Hash Code   : {0}", GetHashCode(FilePath));

或者:

WriteLine("MD5 Hash Code   : {0}", GetHashCode(FilePath, new MD5CryptoServiceProvider()));
WriteLine("SHA1 Hash Code  : {0}", GetHashCode(FilePath, new SHA1CryptoServiceProvider()));
WriteLine("SHA256 Hash Code: {0}", GetHashCode(FilePath, new SHA256CryptoServiceProvider()));
WriteLine("SHA384 Hash Code: {0}", GetHashCode(FilePath, new SHA384CryptoServiceProvider()));
WriteLine("SHA512 Hash Code: {0}", GetHashCode(FilePath, new SHA512CryptoServiceProvider()));

【讨论】:

  • 很好的解决方案!我建议进行一些改进:使第二个参数可以为空,即HashAlgorithm cryptoService = null,然后添加一个默认提供程序,如下所示:using (cryptoService ??= System.Security.Cryptography.SHA512.Create()) - 或者如果您愿意,您也可以使用 MD5(但我不推荐它)。这将简化使用,同时保持最大的灵活性(您仍然可以添加您选择的提供商)。
  • 提示(对于那些需要它的人):如果您需要 StreamReader (fileStreamReader) 而不是文件路径作为参数,您可以在您喜欢 using var fileStream = fileStreamReader.BaseStream; 的地方创建此函数的重载。
【解决方案4】:

这是一个不需要将整个文件读入内存的 .NET Standard 版本:

    private byte[] CalculateMD5OfFile(FileInfo targetFile)
    {
        byte[] hashBytes = null;
        using (var hashcalc = System.Security.Cryptography.MD5.Create())
        {
            using (FileStream inf = targetFile.OpenRead())
                hashcalc.ComputeHash(inf);
            hashBytes = hashcalc.Hash;
        }
        return hashBytes;
    }

您可以使用上面显示的方法将 byte[] 数组转换为字符串。另外:可以将第三行的“MD5”改成SHA1、SHA256等,计算其他的hash。

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多