生成文本文件的 MD5 校验和值

Posted

技术标签:

【中文标题】生成文本文件的 MD5 校验和值【英文标题】:Generating MD5 Checksum value of text file 【发布时间】:2021-12-19 09:06:18 【问题描述】:

我想为当前存储在本地的文件创建校验和。在文件内容中,我只需要校验文件主体,不包括第一行和最后一行(页眉和页脚)。 页眉和页脚始终以 >>

开头

我目前已经在 c# 中实现了代码来生成校验和,但它会为所有文件内容生成它。我目前有两个选项,要么在 c# 代码中生成它,要么在 Windows 上使用命令提示符生成它。

我当前的 c# 代码如下所示:

            string CalculateMD5(string fileLocation)
            
                using (var md5 = MD5.Create())
                
                    using (var stream = File.OpenRead(fileLocation))
                    
                        var hash = md5.ComputeHash(stream);
                        return BitConverter.ToString(hash).Replace("-", "");
                    
                
            

我也试过使用这个 cmd 命令:Certutil -hashfile filename.txt MD5

这再次为整个文件生成 MD5 值,这不是所需的输出。

附言我确实尝试使用 c# 删除第一行和最后一行,然后生成 md5 哈希,但是该值似乎与应有的不同。

欢迎提出任何建议:)

谢谢

【问题讨论】:

如果您从文件中删除页眉和页脚,然后使用此方法对其进行哈希处理,您不会得到您想要的值。那么你就迷路了。你的期望是错误的,这个问题缺少信息 只为文件的一部分计算哈希值的目的是什么?您是否尝试确定相同的数据是否在具有不同页眉/页脚信息的文件中? @lit 验证文件的内容,即正文、页眉和页脚并不重要。 您可以创建一个没有页眉/页脚记录的临时文件,并使用***.com/a/10521162/447901 计算MD5 哈希值。 【参考方案1】:

只是快速地把一些东西放在一起,这样的东西不能解决你的问题吗?

private string CalculateMD5(string path) 
    using var md5 = MD5.Create();

    var txt = string.Join('\n', File.ReadAllLines(path)[1..^1]);

    var hash = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(txt));

    var result = BitConverter.ToString(hash).Replace("-", "");

    return result;

使用 '\n' 加入以在将文件读取为行时添加缺少的换行符,以避免该信息丢失,范围运算符是一个较新的 C# 功能,但可以很容易地以老式方式完成,如果你解决方案需要它

【讨论】:

感谢您的回复。好像我使用的是旧版本的 c# 语言,因为它不支持范围函数 在这种情况下,您可以执行Array.Copy(sourceArrayFromReadLines, 1, destinationArray, 0, sourceArrayFromReadLines.Length - 2),然后在它们上使用string.JoinsourceArrayFromReadLines 是分配有 File.ReadAllLines(path) 值的变量,目标数组为一个新数组string[sourceArrayFromReadLines.Length - 2]【参考方案2】:

如果您使用的是受支持的 Windows 系统,则 PowerShell 已安装且可用,除非您的组织已采取措施对其进行限制。

将两个文件 Get-Md5sum.bat 和 Get-Md5sum.ps1 放入 PATH 变量中的同一目录中。

在您的情况下,您将生成一个没有页眉/页脚记录的临时文件,然后在临时文件上运行 Get-Md5sum。

PS C:\src\t> Get-Content .\Get-Md5sum.bat
@powershell -NoLogo -NoProfile -Command "%~dp0Get-Md5sum.ps1 -Path "%~1""

PS C:\src\t> Get-Content .\Get-Md5sum.ps1
[CmdletBinding()]
Param (
    [Parameter(Mandatory=$true)]
    [string]$Path
)
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
[System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($Path)))

PS C:\src\t> .\Get-Md5sum.bat "C:\src\t\test.txt"
FD-99-05-E1-CA-CE-FA-81-02-D1-C7-D3-35-19-E3-C3

PS C:\src\t> .\Get-Md5sum.ps1 -Path "C:\src\t\test.txt"
FD-99-05-E1-CA-CE-FA-81-02-D1-C7-D3-35-19-E3-C3

PS C:\src\t> .\Get-Md5sum.ps1 "C:\src\t\test.txt"
FD-99-05-E1-CA-CE-FA-81-02-D1-C7-D3-35-19-E3-C3

如果您愿意,可以将结果中的 HYPHEN-MINUS 字符删除和/或转换为小写。

PS C:\src\t> (.\Get-Md5sum.ps1 -Path "C:\src\t\test.txt") -replace '-',''
FD9905E1CACEFA8102D1C7D33519E3C3

PS C:\src\t> (.\Get-Md5sum.ps1 -Path "C:\src\t\test.txt").ToLower()
fd-99-05-e1-ca-ce-fa-81-02-d1-c7-d3-35-19-e3-c3

PS C:\src\t> (.\Get-Md5sum.ps1 -Path "C:\src\t\test.txt").ToLower() -replace '-',''
fd9905e1cacefa8102d1c7d33519e3c3

【讨论】:

以上是关于生成文本文件的 MD5 校验和值的主要内容,如果未能解决你的问题,请参考以下文章

Linux——md5命令

Linux命令之MD5校验md5sum

查看文件md5值

如何在 Maven 中创建校验和,然后将其输出到文本文件?

如何在ubuntu系统中验证系统文件的md5

为啥没有使用逻辑应用自动生成 Azure Blob MD5 校验和?