Не должно быть никаких таких проблем. С размером — не оценивал, лишь бы работал.
MsgBox, % HashFile(A_ScriptFullPath)
HashFile(filename, hashType = "MD5")
{
HASH_ALG := { MD2: CALG_MD2 := 32769
, MD5: CALG_MD5 := 32771
, SHA: CALG_SHA := 32772
, SHA256: CALG_SHA_256 := 32780
, SHA384: CALG_SHA_384 := 32781
, SHA512: CALG_SHA_512 := 32782 }[hashType]
if !f := FileOpen(filename, "r")
return
f.pos := 0
f.rawRead(data, f.length)
return CalcAddrHash(&data, f.length, HASH_ALG)
}
CalcAddrHash(addr, length, algid, byref hash = 0, byref hashlength = 0)
{
static PROV_RSA_AES := 24, CRYPT_VERIFYCONTEXT := 0xF0000000, HP_HASHVAL := 0x0002
if (DllCall("advapi32\CryptAcquireContext", PtrP, hProv, Ptr, 0, Ptr, 0, UInt, PROV_RSA_AES, UInt, CRYPT_VERIFYCONTEXT))
{
if (DllCall("advapi32\CryptCreateHash", Ptr, hProv, UInt, algid, UInt, 0, UInt, 0, "Ptr*", hHash))
{
if (DllCall("advapi32\CryptHashData", Ptr, hHash, Ptr, addr, UInt, length, UInt, 0))
{
if (DllCall("advapi32\CryptGetHashParam", Ptr, hHash, UInt, HP_HASHVAL, Ptr, 0, UIntP, hashlength, UInt, 0))
{
VarSetCapacity(hash, hashlength, 0)
if (DllCall("advapi32\CryptGetHashParam", Ptr, hHash, UInt, HP_HASHVAL, Ptr, &hash, UIntP, hashlength, UInt, 0))
Loop % hashlength
hashstr .= Format( "{:02X}", *(&hash + A_Index - 1) )
}
}
DllCall("advapi32\CryptDestroyHash", Ptr, hHash)
}
DllCall("advapi32\CryptReleaseContext", Ptr, hProv, UInt, 0)
}
return hashstr
}