生成文本文件的 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.Join
,sourceArrayFromReadLines
是分配有 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 校验和值的主要内容,如果未能解决你的问题,请参考以下文章