我给网站做了一个文件哈希值在线计算,但是为了快速获得结果,我采用的是整个文件一次性计算,这就导致对大文件不友好,比如计算1GB的文件,就需要调用1G内存来运算,再加上浏览器本身的占用,这对于电脑内存低的用户来说不太好,可能会造成浏览器崩溃,所以我网站的在线计算是限制到了1GB的大小。
如果采用分块计算最后合并,这样速度又跟不上了。所以我觉得大文件计算还是直接用电脑默认的终端来实现。
先说下为什么我网站提供的在线计算只支持SHA256和SHA512,不支持MD5和SHA1?
很简单,就是MD5和SHA1不一定就真的安全。现在很多大厂默认提供的查询结果就是SHA256,比如现在Windows 11系统计算文件哈希值的命令,默认出来的结果就是SHA256,而我网站的在线计算也是用的浏览器原生crypto对象来计算(Web Crypto API),最低也是SHA256.
如果是小于1GB的文件,直接用网站查询就行:文件哈希值在线计算 – 小半软件
Windows 11用终端文件查看文件的哈希命令:
Get-FileHash -Path "D:\test\sha\xiaoban.exe"
这条命令默认出来的就是SHA256的值。
查询MD5:
Get-FileHash -Path "D:\test\sha\xiaoban.exe" -Algorithm MD5
查询SHA1:
Get-FileHash -Path "D:\test\sha\xiaoban.exe" -Algorithm SHA1
Algorithm是算法类型(MD5、SHA1、SHA256 等),把里面具体的文件路径换成你自己的。
也可以用脚本来一次性查询MD5、SHA1和SHA256,分为2种,用终端命令去执行脚本,或者用bat文件去双击自动实现。我一开始准备的是第一种,但是考虑到可能有的用户并不熟练命令,所以我今天又改成了自动实现的方式。
计算代码,保存为:Generate-Hashes.ps1 文件
# 设置PowerShell控制台输出为UTF-8编码
$OutputEncoding = [System.Text.Encoding]::UTF8

# 获取脚本所在目录
$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent

# 获取脚本自身的完整路径
$currentScriptPath = $MyInvocation.MyCommand.Definition
$batFilePath = Join-Path -Path $scriptDirectory -ChildPath "Run-Hashes.bat"

# 获取当前目录下所有文件,并排除脚本文件自身和批处理文件
$files = Get-ChildItem -Path $scriptDirectory -File | Where-Object {
    $_.FullName -notin @($currentScriptPath, $batFilePath)
}

# 遍历所有文件并生成哈希值
foreach ($file in $files) {
    try {
        # 获取MD5, SHA1和SHA256哈希值
        $md5 = Get-FileHash -Path $file.FullName -Algorithm MD5
        $sha1 = Get-FileHash -Path $file.FullName -Algorithm SHA1
        $sha256 = Get-FileHash -Path $file.FullName -Algorithm SHA256

        # 构造输出内容
        $output = @"
文件路径: $($file.FullName)
MD5: $($md5.Hash)
SHA1: $($sha1.Hash)
SHA256: $($sha256.Hash)

"@

        # 将结果保存到文本文件,使用UTF-8编码
        $outputFile = Join-Path -Path $scriptDirectory -ChildPath "$($file.BaseName)_Hashes.txt"
        $output | Out-File -FilePath $outputFile -Encoding utf8

        Write-Host "哈希值已保存到 $outputFile"
    } catch {
        Write-Host "处理文件 $($file.FullName) 时出错:" -ForegroundColor Red
        Write-Host $_.Exception.Message -ForegroundColor Yellow
    }
}

Write-Host "所有文件处理完成。" -ForegroundColor Green
批处理文件代码,把这个保存为:Run-Hashes.bat文件
@echo off
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0Generate-Hashes.ps1"
exit

然后把2个文件放到同一个文件夹,把要计算的文件放到这个文件之后,双击Run-Hashes.bat就行。

 

我提供的脚本常见问题:

1、如果失败,可能是提示禁止允许脚本,这是因为Windows 11系统默认是不支持运行所有脚本的,所以这个时候你需要以管理员的身份打开终端,去修改执行策略,输入以下命令:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
这个命令是把策略改为:
  • 允许本地脚本运行,远程脚本需要签名。
你不用之后也可以再修改回去:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Restricted
2、文件里面的中文字乱码,这是因为你电脑的终端默认不支持UTF-8格式,并不影响正常使用,只是几个中文字提示没有正常显示而已。