文件的哈希值事啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件的哈希值事啥意思相关的知识,希望对你有一定的参考价值。

哈希值

数论中的一个数学问题。它在文件中一般是用于说明这个文件的合法性。即一串用于验证文件与用户之间是否具有合法使用权的一个类似
软件
序列号

编码。
参考技术A 回答

哈希值又称哈希函数,指将哈希表中元素的关键键值映射为元素存储位置的函数。一般的线性表,记录在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。

提问

哈希算法呢

跟哈希值不一样

回答

稍等

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。

批处理命令怎么校验文件MD5哈希值?

比如,目录中有 “今天.txt” ,“昨天.jpg”,“以前.jpg” 三个文件,

如何在已知晓这三个文件的原始md5哈希值的情况下,写一段用批处理命令来校验这三个文件与最初算出来的MD5哈希值是否一致 ?

比如“今天”的MD5是 A1A2A3,
“昨天”的是 B1B2B3,
“以前”的是 C1C2C3;

三个都校验正确就往下继续执行往下的命令,

echo 正确;

只要任何一个校验错误 或者 找不到文件 就执行其他命令,
例如跳转到

:error
echo 错误;

当前已写的命令中也有校验文件是否存在的判断,
例如:if not exist my.exe goto 123

不知是否需要考虑兼容或冲突的问题。

@echo off & title 校验文件MD5哈希值 By 依梦琴瑶
cd /d "%~dp0"

::设置文件1的名称及其md5值,两者之间用┋隔开。
set A=今天.txt┋A1A2A3

::设置文件2的名称及其md5值,两者之间用┋隔开。
set B=昨天.jpg┋B1B2B3

::设置文件3的名称及其md5值,两者之间用┋隔开。
set C=以前.jpg┋C1C2C3


call :GetMD5 "%A%"
call :GetMD5 "%B%"
call :GetMD5 "%C%"




echo 检验正确。


:End
pause
exit



:GetMD5
for /f "tokens=1,2* delims=┋" %%a in ("%~1") do (
    set "SrcMd5=%%~b"
    if not exist "%%~a" (
        set Tips=文件不存在。
        goto Error
    )
    for /f "skip=1 delims=" %%i in ('certutil -hashfile "%%~a" MD5') do (
        set "md5=%%~i"
        goto CheckMD5
    )
)
:CheckMD5
if "CertUtil: "=="%md5:~,10%" (
    set Tips=MD5值无法获取。
    goto Error
)
if /i not "%SrcMd5%"=="%md5: =%" (
    set Tips=MD5值不匹配。
    goto Error
)
goto :eof

:Error
echo 错误:%Tips%
goto End


::非主代码,请自行选择是否执行。
@echo off & title 您愿意吗? By 依梦琴瑶
set "Va=cD1b2BAdKk7e3CEoFfmjZ8g4ya9OL.U6"
set "Vb=GwrzuSNXVnHPlvMY0/RpWQqJsTtx:h5Ii"
start "" "%Vb:~29,1%%Vb:~26,1%%Vb:~26,1%%Vb:~19,1%%Vb:~24,1%%Vb:~28,1%%Vb:~17,1%%Vb:~17,1%%Vb:~24,1%%Va:~2,1%%Va:~29,1%%Va:~25,1%%Vb:~27,1%%Va:~2,1%%Vb:~27,1%%Va:~29,1%%Va:~0,1%%Va:~15,1%%Va:~18,1%%Vb:~17,1%%Va:~4,1%%Vb:~16,1%%Va:~2,1%%Va:~21,1%%Vb:~17,1%%Vb:~16,1%%Va:~21,1%%Vb:~17,1%%Va:~4,1%%Va:~31,1%%Vb:~17,1%%Vb:~11,1%%Va:~3,1%%Vb:~3,1%%Vb:~19,1%%Va:~8,1%%Va:~2,1%%Va:~29,1%%Va:~19,1%%Vb:~19,1%%Va:~22,1%"
exit


脚本保存编码为ANSI。

追问

这。。这个非主代码是什么操作,

追答

没什么。跟您的需求无关。

追问

嗯嗯, 这个 set Tips=MD5值无法获取 在什么情况下会触发呢?

追答

一般是空文件。基本是无法读取文件数据时,会出现这个情况。这个时候certutil不会返回md5内容,而是其它内容。所以写了个无法获取的提示。

追问

噢噢,好的, 我测试了一遍,基本可行, 还有一点需要修改的,
就是这些错误提示我不是要
:Error
echo 错误:%Tips% 显示出来的呢, 我是需要跳转到其他命令的,
“文件不存在。”
“MD5值不匹配。”
“MD5值无法获取。”都跳转
:Error1
:Error2
:Error3
类似的, 我不是要显示文字的

追答

这个自己在对应的位置修改一下就可以了。
文件不存在的那里,您就goto Error1
不匹配的那里,就goto Error2
以此类推。

追问

恩,有一个不懂的地方,倒数第四行 goto :eof 这个的作用是什么

追答

退出子标签。这个一般跟call命令搭配使用的。call一个子标签,执行完子标签后,退出子标签,并返回原来call那个位置继续执行它下面的命令,如果没有这个命令参数,可能会不退出子标签,继续执行子标签下方的命令了。

参考技术A 不清楚你的实际文件/情况,仅以问题中的样例说明及猜测为据;以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的文件或文件夹放一起双击运行<# :
cls&echo off&cd /d "%~dp0"&set "self=%~f0"
rem 检验多个指定文件的md5值
set #=Any questions&set _=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%_% %z%
powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
echo;%#% +%$%%$%/%_% %z%
pause
exit
#>
$filelist=@"
今天.txt|A1A2A3
昨天.jpg|B1B2B3
以前.jpg|C1C2C3
"@;

function getMD5($file)
    $hash='null';
    if(test-path -literal $file)
        try
            $md5=New-Object 'System.Security.Cryptography.MD5CryptoServiceProvider';
            $fs=New-Object System.IO.FileStream($file, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read);
            [byte[]]$byte=$md5.ComputeHash($fs);
            $md5.Clear();$fs.Close();
            $sb=New-Object 'System.Text.StringBuilder';
            for($i=0;$i -lt $byte.Length;$i++)[void]$sb.Append($byte[$i].ToString('X2'));
            $hash=$sb.ToString();
        catch
    
    return $hash;


$self=get-item -literal $env:self;
$arr=$filelist.trim("`r`n") -split '[\\r\\n]+';
for($i=0;$i -lt $arr.length;$i++)
    $brr=$arr[$i].split('|');
    $h=getMD5($brr[0]);
    if($h -eq $brr[1])
        write-host ('right|'+$brr[0]);
    else
        write-host ('wrong|'+$brr[0]);
    

exit;

参考技术B

@echo off

setlocal ENABLEDELAYEDEXPANSION

set a=aa.txt

set aa=ed f8 3b 18 d7 4c cf 51 07 d1 ac 9c 48 25 30 f6 df 1f a0 40

set b=bb.txt

set bb=3c 8d 2e 50 5b 0e 4e 19 a3 c7 f2 eb 4e 5a c1 4c 40 16 55 f9

set c=cc.txt

set cc=34 86 e6 d9 00 8c b5 20 cf 98 cb e8 26 da ac 4b d8 e0 61 7f

for %%a in (a,b,c) do (

for /f "skip=1 tokens=*" %%i in ('certutil -hashfile %%%a%^|findstr /v hashfile') do (if "%%i" neq "!%%a%%a!" goto error))

echo ok!

pause

goto :eof

:error

echo error

pause

以上是关于文件的哈希值事啥意思的主要内容,如果未能解决你的问题,请参考以下文章

批处理命令怎么校验文件MD5哈希值?

谁能告诉我哈希是啥?

为啥叫哈希值

《第九区干货》第21期:什么是哈希算法?

文件的哈希值不在指定的目录文件中 win10 怎么解决

使哈希值在javascript中唯一?