You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows系统中复现Linux端md5sum的组合校验值计算逻辑

复现Linux md5sum级联校验的PowerShell实现

你要的逻辑完全可以用少量代码实现,核心是对齐Linux端的换行规则、编码、文件排序逻辑,以下是可直接运行的代码:

完整可用代码

# 替换为你要校验的文件夹路径
$targetPath = "C:\替换为你的实际目录路径"

# 步骤1:获取所有txt文件,按文件名升序排序(和Linux glob的默认排序逻辑对齐)
$txtFiles = Get-ChildItem -Path $targetPath -Filter *.txt -File | Sort-Object Name

# 步骤2:收集所有单个文件的小写MD5值,每个值末尾追加Linux风格的LF换行符
$hashConcatenated = ""
foreach ($file in $txtFiles) {
    $singleFileHash = (Get-FileHash -Path $file.FullName -Algorithm MD5).Hash.ToLower()
    $hashConcatenated += "$singleFileHash`n"
}

# 步骤3:用UTF-8无BOM编码转成字节流,计算最终的级联MD5
$utf8NoBomEncoding = [System.Text.UTF8Encoding]::new($false)
$hashBytes = $utf8NoBomEncoding.GetBytes($hashConcatenated)
$stream = [System.IO.MemoryStream]::new($hashBytes)
$finalChecksum = (Get-FileHash -InputStream $stream -Algorithm MD5).Hash.ToLower()

# 输出最终结果
Write-Output "匹配Linux端的最终校验值:$finalChecksum"

之前代码的问题说明

  • 不应使用Write-Host输出单个哈希值,该命令的输出只会打印到控制台,无法被变量捕获或进入管道传递
  • 换行符未对齐:Linux下输出的每行哈希结尾是LF(\n),Windows默认换行是CRLF(\r\n),直接用默认换行或写本地文件会导致内容不一致
  • 流操作逻辑错误:向MemoryStream写入内容后没有将流指针重置到起始位置,传给Get-FileHash时读取的是空内容
  • 编码不对齐:默认流写入可能带UTF-8 BOM或使用系统默认编码,和Linux端的无BOM UTF-8编码不一致,导致字节流差异

简化写法

如果不需要中间调试输出,可以用更简洁的写法:

$targetPath = "C:\替换为你的实际目录路径"
$md5Provider = [System.Security.Cryptography.MD5]::Create()
$utf8NoBom = [System.Text.UTF8Encoding]::new($false)

$allHashStr = (Get-ChildItem $targetPath -Filter *.txt -File | Sort-Object Name | ForEach-Object {
    (Get-FileHash $_.FullName -Algorithm MD5).Hash.ToLower() + "`n"
}) -join ''

$finalHash = [BitConverter]::ToString($md5Provider.ComputeHash($utf8NoBom.GetBytes($allHashStr))).Replace('-','').ToLower()
Write-Output $finalHash

内容的提问来源于stack exchange,提问作者16shells

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:36:03