方法 取数据md5 <公开 类型 = 文本型 注释 = "bcrypt.h cng库方法" 折叠2 @视窗.外部头文件 = "bcrypt.h" @视窗.外部库 = "Bcrypt.lib"
@禁止流程检查 = 真>
参数 数据 <类型 = 字节集类 注释 = "提供所欲计算摘要的数据.">
参数 是否大写 <类型 = 逻辑型 注释 = "真为大写,假为小写,默认小写" @默认值 = 假>
参数 是否32位 <类型 = 逻辑型 注释 = "真为32位,假为16位,默认32位" @默认值 = 真>
{
// 初始化 CNG 提供程序
@ BCRYPT_ALG_HANDLE phAlgorithm;
@ if (BCryptOpenAlgorithmProvider (&phAlgorithm,BCRYPT_MD5_ALGORITHM, NULL, 0)){return "";}
// 创建哈希
@ BCRYPT_HASH_HANDLE phHash;
@ if (BCryptCreateHash (phAlgorithm, &phHash, NULL, NULL, NULL, 0, 0)){BCryptCloseAlgorithmProvider (phAlgorithm, 0);return "";}
// 执行单向哈希
@ if (BCryptHashData (phHash, (PUCHAR)@<数据>.GetPtr (), (ULONG)@<数据>.GetSize (), 0)){BCryptDestroyHash (phHash);BCryptCloseAlgorithmProvider (phAlgorithm, 0);return "";}
// 函数检索属性的值
@ DWORD dwHashDigLen, dwPropertySize;
@ if (BCryptGetProperty (phAlgorithm, BCRYPT_HASH_LENGTH, (PUCHAR)&dwHashDigLen, 4, &dwPropertySize, 0)){BCryptDestroyHash (phHash);BCryptCloseAlgorithmProvider (phAlgorithm, 0);return "";}
// 提取哈希数据
@ CVolMem HashData;
@ HashData.Alloc ((INT)dwHashDigLen, TRUE);
@ BCryptFinishHash (phHash, (PUCHAR)HashData.GetPtr (), (ULONG)HashData.GetSize (), 0);
// 释放哈希对象
@ BCryptDestroyHash (phHash);//释放哈希对象
@ BCryptCloseAlgorithmProvider (phAlgorithm, 0);//关闭算法程序
@ CWString Data=HashData.ToHexStr (CVolString ());//字节集到十六进制文本
@ if(!@<是否大写>){Data=Data.MakeLower ();}//大小写转换
@ if(!@<是否32位>){Data=Data.Middle (8,16);}
@ return Data;
}
创世魂 发表于 2023-11-1 21:50
如果是文本要注意编码问题。。 想要和易语言一样,火山里面需要使用文本到多字节("111",假) ...
可以了,谢谢您!
页:
1
[2]