关于本文
本文是通过利用生成式 AI 的自动化流程创建的。内容经过整理,参考了 Microsoft Learn 的 Get-FileHash 与 NIST 的 SHA-256 规范,并通过 TEMP 目录下的虚拟文件观察内容差异。验证状态:📘 已确认 Microsoft 与 NIST 官方规范,Windows 实机未验证
即使文件名和大小相同,内容也未必相同。通过 PowerShell 的 Get-FileHash 计算 SHA-256 并比较两个摘要,即可在备份或复制后轻松确认内容。
首先尝试
仅在 TEMP 目录下创建虚拟文件。
$dir = Join-Path $env:TEMP 'papanda-hash-demo' New-Item -ItemType Directory -Path $dir -Force | Out-Null 'PANDA-001' | Set-Content (Join-Path $dir 'a.txt') -NoNewline 'PANDA-001' | Set-Content (Join-Path $dir 'b.txt') -NoNewline $hashA = Get-FileHash (Join-Path $dir 'a.txt') -Algorithm SHA256 $hashB = Get-FileHash (Join-Path $dir 'b.txt') -Algorithm SHA256 $hashA $hashB "Same = $($hashA.Hash -eq $hashB.Hash)"
期望观察到的要点是 Same = True。
查看此处
SHA-256 根据文件内容计算出固定长度的摘要。因为输入的是字节序列而非文件名,所以相同的内容会产生相同的摘要。
flowchart LR
A[File A] --> C[SHA-256]
B[File B] --> D[SHA-256]
C --> E{digest比較}
D --> E
E -->|同じ| F[内容一致を強く確認]
E -->|違う| G[内容は異なる]
尝试修改一处
b.txt 仅修改末尾的一个字符。
'PANDA-002' | Set-Content (Join-Path $dir 'b.txt') -NoNewline $hashB2 = Get-FileHash (Join-Path $dir 'b.txt') -Algorithm SHA256 "Same = $($hashA.Hash -eq $hashB2.Hash)"
这次变成了 False。可以观察到,即使只更改一个字符,摘要也会发生巨大变化。
哈希不是加密
SHA-256 并不是将文件保密的功能。它是一种从内容生成摘要的单向哈希函数。NIST 在安全哈希标准(Secure Hash Standard)中定义了 SHA-256。
由于哈希碰撞作为一个理论概念是存在的,因此不能断言“摘要相同则数学上绝对相同”。不过,在常规的文件完整性确认中,使用一致的 SHA-256 是一种非常强有力的确认方法。
与大小比较的区别
大小相同的文件,内容也可能不同。例如 ABC 和 XYZ 的长度都是 3 个字符,但内容完全不同。
'ABC' | Set-Content (Join-Path $dir 'a.txt') -NoNewline 'XYZ' | Set-Content (Join-Path $dir 'b.txt') -NoNewline Get-Item (Join-Path $dir '*.txt') | Select-Object Name, Length Get-FileHash (Join-Path $dir '*.txt') -Algorithm SHA256
“大小相同”可用于快速的初步检查,但它不等同于“内容相同”。
如果在工作中应用
确认复制到 NAS 的重要文件是否与原文件相同
在备份还原后进行校验
将从供应商处收到的分发文件与官方的 SHA-256 值进行核对
当存在多个同名文件时,对它们的内容是否相同进行分类
在处理大量文件时,计算哈希需要读取时间,因此建议先确认文件数量和大小再执行。此外,获取“官方网站公布的哈希值”的途径本身是否可靠也很重要。
善后清理
仅删除虚拟文件。
Remove-Item -LiteralPath $dir -Recurse -Force
$dir请同时确认操作已被限制在自行指定的 TEMP 目录内。
