HashFromAddr(pData, len, algid, key=0) { hProv := size := hHash := hash := "" ptr := (A_PtrSize) ? "ptr" : "uint" aw := (A_IsUnicode) ? "W" : "A" if (DllCall("advapi32\CryptAcquireContext" aw, ptr "*", hProv, ptr, 0, ptr, 0, "uint", 1, "uint", 0xF0000000)) { if (DllCall("advapi32\CryptCreateHash", ptr, hProv, "uint", algid, "uint", key, "uint", 0, ptr "*", hHash)) { if (DllCall("advapi32\CryptHashData", ptr, hHash, ptr, pData, "uint", len, "uint", 0)) { if (DllCall("advapi32\CryptGetHashParam", ptr, hHash, "uint", 2, ptr, 0, "uint*", size, "uint", 0)) { VarSetCapacity(bhash, size, 0) DllCall("advapi32\CryptGetHashParam", ptr, hHash, "uint", 2, ptr, &bhash, "uint*", size, "uint", 0) } } DllCall("advapi32\CryptDestroyHash", ptr, hHash) } DllCall("advapi32\CryptReleaseContext", ptr, hProv, "uint", 0) } int := A_FormatInteger SetFormat, Integer, h Loop, % size { v := substr(NumGet(bhash, A_Index-1, "uchar") "", 3) while (strlen(v)<2) v := "0" v hash .= v } SetFormat, Integer, % int return hash } HashFromString(string, algid, key=0) { len := strlen(string) if (A_IsUnicode) { VarSetCapacity(data, len) StrPut := "StrPut" %StrPut%(string, &data, len, "cp0") return HashFromAddr(&data, len, algid, key) } data := string return HashFromAddr(&data, len, algid, key) } MD5(string) { return HashFromString(string, 0x8003) }